forked from TuxCoding/FastLogin
Added support of detecting name changes (Fixes #18)
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
######1.4
|
######1.4
|
||||||
|
|
||||||
* Added Bungee setAuthPlugin method
|
* Added Bungee setAuthPlugin method
|
||||||
|
* Added nameChangeCheck
|
||||||
* Multiple BungeeCord support
|
* Multiple BungeeCord support
|
||||||
|
|
||||||
######1.3.1
|
######1.3.1
|
||||||
|
@ -15,6 +15,7 @@ So they don't need to enter passwords. This is also called auto login (auto-logi
|
|||||||
* Forge/Sponge message support
|
* Forge/Sponge message support
|
||||||
* Premium UUID support
|
* Premium UUID support
|
||||||
* Forwards Skins
|
* Forwards Skins
|
||||||
|
* Detect user name changed and will update the existing database record
|
||||||
* BungeeCord support
|
* BungeeCord support
|
||||||
* Auto register new premium players
|
* Auto register new premium players
|
||||||
* Plugin: ProtocolSupport is supported and can be used as an alternative to ProtocolLib
|
* Plugin: ProtocolSupport is supported and can be used as an alternative to ProtocolLib
|
||||||
|
@ -7,6 +7,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Achievement;
|
import org.bukkit.Achievement;
|
||||||
import org.bukkit.Effect;
|
import org.bukkit.Effect;
|
||||||
import org.bukkit.EntityEffect;
|
import org.bukkit.EntityEffect;
|
||||||
|
@ -71,7 +71,7 @@ public class LoginSecurityHook implements BukkitAuthPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean forceRegister(final Player player, final String password) {
|
public boolean forceRegister(Player player, String password) {
|
||||||
DataManager dataManager = securityPlugin.data;
|
DataManager dataManager = securityPlugin.data;
|
||||||
|
|
||||||
UUID playerUUID = player.getUniqueId();
|
UUID playerUUID = player.getUniqueId();
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.github.games647.fastlogin.bukkit.listener;
|
package com.github.games647.fastlogin.bukkit.listener;
|
||||||
|
|
||||||
import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
|
|
||||||
import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
|
import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
|
||||||
|
import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
|
||||||
import com.github.games647.fastlogin.bukkit.hooks.BukkitAuthPlugin;
|
import com.github.games647.fastlogin.bukkit.hooks.BukkitAuthPlugin;
|
||||||
import com.github.games647.fastlogin.core.PlayerProfile;
|
import com.github.games647.fastlogin.core.PlayerProfile;
|
||||||
|
|
||||||
@ -40,20 +40,31 @@ public class ProtocolSupportListener implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerProfile playerProfile = plugin.getCore().getStorage().loadProfile(username);
|
PlayerProfile profile = plugin.getCore().getStorage().loadProfile(username);
|
||||||
if (playerProfile != null) {
|
if (profile != null) {
|
||||||
if (playerProfile.isPremium()) {
|
if (profile.isPremium()) {
|
||||||
if (playerProfile.getUserId() != -1) {
|
if (profile.getUserId() != -1) {
|
||||||
startPremiumSession(username, loginStartEvent, true, playerProfile);
|
startPremiumSession(username, loginStartEvent, true, profile);
|
||||||
}
|
}
|
||||||
} else if (playerProfile.getUserId() == -1) {
|
} else if (profile.getUserId() == -1) {
|
||||||
//user not exists in the db
|
//user not exists in the db
|
||||||
try {
|
try {
|
||||||
|
if (plugin.getConfig().getBoolean("nameChangeCheck")) {
|
||||||
|
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
||||||
|
if (premiumUUID != null) {
|
||||||
|
profile = plugin.getCore().getStorage().loadProfile(premiumUUID);
|
||||||
|
if (profile != null) {
|
||||||
|
plugin.getLogger().log(Level.FINER, "Player {0} changed it's username", premiumUUID);
|
||||||
|
startPremiumSession(username, loginStartEvent, false, profile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (plugin.getConfig().getBoolean("autoRegister") && !authPlugin.isRegistered(username)) {
|
if (plugin.getConfig().getBoolean("autoRegister") && !authPlugin.isRegistered(username)) {
|
||||||
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
||||||
if (premiumUUID != null) {
|
if (premiumUUID != null) {
|
||||||
plugin.getLogger().log(Level.FINER, "Player {0} uses a premium username", username);
|
plugin.getLogger().log(Level.FINER, "Player {0} uses a premium username", username);
|
||||||
startPremiumSession(username, loginStartEvent, false, playerProfile);
|
startPremiumSession(username, loginStartEvent, false, profile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
@ -75,8 +86,7 @@ public class ProtocolSupportListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startPremiumSession(String playerName, PlayerLoginStartEvent loginStartEvent, boolean registered
|
private void startPremiumSession(String playerName, PlayerLoginStartEvent loginStartEvent, boolean registered, PlayerProfile playerProfile) {
|
||||||
, PlayerProfile playerProfile) {
|
|
||||||
loginStartEvent.setOnlineMode(true);
|
loginStartEvent.setOnlineMode(true);
|
||||||
InetSocketAddress address = loginStartEvent.getAddress();
|
InetSocketAddress address = loginStartEvent.getAddress();
|
||||||
|
|
||||||
|
@ -5,8 +5,8 @@ import com.comphenix.protocol.ProtocolManager;
|
|||||||
import com.comphenix.protocol.events.PacketAdapter;
|
import com.comphenix.protocol.events.PacketAdapter;
|
||||||
import com.comphenix.protocol.events.PacketContainer;
|
import com.comphenix.protocol.events.PacketContainer;
|
||||||
import com.comphenix.protocol.events.PacketEvent;
|
import com.comphenix.protocol.events.PacketEvent;
|
||||||
import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
|
|
||||||
import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
|
import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
|
||||||
|
import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
|
||||||
import com.github.games647.fastlogin.bukkit.hooks.BukkitAuthPlugin;
|
import com.github.games647.fastlogin.bukkit.hooks.BukkitAuthPlugin;
|
||||||
import com.github.games647.fastlogin.core.PlayerProfile;
|
import com.github.games647.fastlogin.core.PlayerProfile;
|
||||||
|
|
||||||
@ -92,6 +92,17 @@ public class StartPacketListener extends PacketAdapter {
|
|||||||
} else if (profile.getUserId() == -1) {
|
} else if (profile.getUserId() == -1) {
|
||||||
//user not exists in the db
|
//user not exists in the db
|
||||||
try {
|
try {
|
||||||
|
if (plugin.getConfig().getBoolean("nameChangeCheck")) {
|
||||||
|
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
||||||
|
if (premiumUUID != null) {
|
||||||
|
profile = plugin.getCore().getStorage().loadProfile(premiumUUID);
|
||||||
|
if (profile != null) {
|
||||||
|
plugin.getLogger().log(Level.FINER, "Player {0} changed it's username", premiumUUID);
|
||||||
|
enablePremiumLogin(username, profile, sessionKey, player, packetEvent, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (plugin.getConfig().getBoolean("autoRegister") && !authPlugin.isRegistered(username)) {
|
if (plugin.getConfig().getBoolean("autoRegister") && !authPlugin.isRegistered(username)) {
|
||||||
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
||||||
if (premiumUUID != null) {
|
if (premiumUUID != null) {
|
||||||
|
@ -38,6 +38,18 @@ public class AsyncPremiumCheck implements Runnable {
|
|||||||
} else if (profile.getUserId() == -1) {
|
} else if (profile.getUserId() == -1) {
|
||||||
//user not exists in the db
|
//user not exists in the db
|
||||||
BungeeAuthPlugin authPlugin = plugin.getBungeeAuthPlugin();
|
BungeeAuthPlugin authPlugin = plugin.getBungeeAuthPlugin();
|
||||||
|
if (plugin.getConfiguration().getBoolean("nameChangeCheck")) {
|
||||||
|
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
||||||
|
if (premiumUUID != null) {
|
||||||
|
profile = plugin.getCore().getStorage().loadProfile(premiumUUID);
|
||||||
|
if (profile != null) {
|
||||||
|
plugin.getLogger().log(Level.FINER, "Player {0} changed it's username", premiumUUID);
|
||||||
|
connection.setOnlineMode(true);
|
||||||
|
plugin.getSession().put(connection, new LoginSession(username, false, profile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (plugin.getConfiguration().getBoolean("autoRegister")
|
if (plugin.getConfiguration().getBoolean("autoRegister")
|
||||||
&& (authPlugin == null || !authPlugin.isRegistered(username))) {
|
&& (authPlugin == null || !authPlugin.isRegistered(username))) {
|
||||||
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
UUID premiumUUID = plugin.getCore().getMojangApiConnector().getPremiumUUID(username);
|
||||||
|
@ -37,14 +37,9 @@ public class FastLoginBungee extends Plugin {
|
|||||||
|
|
||||||
private final Random random = new Random();
|
private final Random random = new Random();
|
||||||
|
|
||||||
private final ConcurrentMap<PendingConnection, Object> pendingAutoRegister = CacheBuilder
|
|
||||||
.newBuilder()
|
|
||||||
.expireAfterWrite(1, TimeUnit.MINUTES)
|
|
||||||
.<PendingConnection, Object>build().asMap();
|
|
||||||
|
|
||||||
private final ConcurrentMap<PendingConnection, LoginSession> session = CacheBuilder
|
private final ConcurrentMap<PendingConnection, LoginSession> session = CacheBuilder
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.expireAfterWrite(1, TimeUnit.MINUTES)
|
.expireAfterWrite(5, TimeUnit.MINUTES)
|
||||||
.<PendingConnection, LoginSession>build().asMap();
|
.<PendingConnection, LoginSession>build().asMap();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -46,9 +46,10 @@ public class Storage {
|
|||||||
|
|
||||||
public void createTables() throws SQLException {
|
public void createTables() throws SQLException {
|
||||||
Connection con = null;
|
Connection con = null;
|
||||||
|
Statement createStmt = null;
|
||||||
try {
|
try {
|
||||||
con = dataSource.getConnection();
|
con = dataSource.getConnection();
|
||||||
Statement statement = con.createStatement();
|
createStmt = con.createStatement();
|
||||||
String createDataStmt = "CREATE TABLE IF NOT EXISTS " + PREMIUM_TABLE + " ("
|
String createDataStmt = "CREATE TABLE IF NOT EXISTS " + PREMIUM_TABLE + " ("
|
||||||
+ "UserID INTEGER PRIMARY KEY AUTO_INCREMENT, "
|
+ "UserID INTEGER PRIMARY KEY AUTO_INCREMENT, "
|
||||||
+ "UUID CHAR(36), "
|
+ "UUID CHAR(36), "
|
||||||
@ -65,21 +66,23 @@ public class Storage {
|
|||||||
createDataStmt = createDataStmt.replace("AUTO_INCREMENT", "AUTOINCREMENT");
|
createDataStmt = createDataStmt.replace("AUTO_INCREMENT", "AUTOINCREMENT");
|
||||||
}
|
}
|
||||||
|
|
||||||
statement.executeUpdate(createDataStmt);
|
createStmt.executeUpdate(createDataStmt);
|
||||||
} finally {
|
} finally {
|
||||||
closeQuietly(con);
|
closeQuietly(con);
|
||||||
|
closeQuietly(createStmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerProfile loadProfile(String name) {
|
public PlayerProfile loadProfile(String name) {
|
||||||
Connection con = null;
|
Connection con = null;
|
||||||
|
PreparedStatement loadStmt = null;
|
||||||
|
ResultSet resultSet = null;
|
||||||
try {
|
try {
|
||||||
con = dataSource.getConnection();
|
con = dataSource.getConnection();
|
||||||
PreparedStatement loadStatement = con.prepareStatement("SELECT * FROM " + PREMIUM_TABLE
|
loadStmt = con.prepareStatement("SELECT * FROM " + PREMIUM_TABLE + " WHERE Name=?");
|
||||||
+ " WHERE Name=? LIMIT 1");
|
loadStmt.setString(1, name);
|
||||||
loadStatement.setString(1, name);
|
|
||||||
|
|
||||||
ResultSet resultSet = loadStatement.executeQuery();
|
resultSet = loadStmt.executeQuery();
|
||||||
if (resultSet.next()) {
|
if (resultSet.next()) {
|
||||||
long userId = resultSet.getInt(1);
|
long userId = resultSet.getInt(1);
|
||||||
|
|
||||||
@ -104,6 +107,39 @@ public class Storage {
|
|||||||
core.getLogger().log(Level.SEVERE, "Failed to query profile", sqlEx);
|
core.getLogger().log(Level.SEVERE, "Failed to query profile", sqlEx);
|
||||||
} finally {
|
} finally {
|
||||||
closeQuietly(con);
|
closeQuietly(con);
|
||||||
|
closeQuietly(loadStmt);
|
||||||
|
closeQuietly(resultSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlayerProfile loadProfile(UUID uuid) {
|
||||||
|
Connection con = null;
|
||||||
|
PreparedStatement loadStmt = null;
|
||||||
|
ResultSet resultSet = null;
|
||||||
|
try {
|
||||||
|
con = dataSource.getConnection();
|
||||||
|
loadStmt = con.prepareStatement("SELECT * FROM " + PREMIUM_TABLE + " WHERE UUID=?");
|
||||||
|
loadStmt.setString(1, uuid.toString().replace("-", ""));
|
||||||
|
|
||||||
|
resultSet = loadStmt.executeQuery();
|
||||||
|
if (resultSet.next()) {
|
||||||
|
long userId = resultSet.getInt(1);
|
||||||
|
|
||||||
|
String name = resultSet.getString(3);
|
||||||
|
boolean premium = resultSet.getBoolean(4);
|
||||||
|
String lastIp = resultSet.getString(5);
|
||||||
|
long lastLogin = resultSet.getTimestamp(6).getTime();
|
||||||
|
PlayerProfile playerProfile = new PlayerProfile(userId, uuid, name, premium, lastIp, lastLogin);
|
||||||
|
return playerProfile;
|
||||||
|
}
|
||||||
|
} catch (SQLException sqlEx) {
|
||||||
|
core.getLogger().log(Level.SEVERE, "Failed to query profile", sqlEx);
|
||||||
|
} finally {
|
||||||
|
closeQuietly(con);
|
||||||
|
closeQuietly(loadStmt);
|
||||||
|
closeQuietly(resultSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -111,46 +147,69 @@ public class Storage {
|
|||||||
|
|
||||||
public boolean save(PlayerProfile playerProfile) {
|
public boolean save(PlayerProfile playerProfile) {
|
||||||
Connection con = null;
|
Connection con = null;
|
||||||
|
PreparedStatement updateStmt = null;
|
||||||
|
PreparedStatement saveStmt = null;
|
||||||
|
|
||||||
|
ResultSet generatedKeys = null;
|
||||||
try {
|
try {
|
||||||
con = dataSource.getConnection();
|
con = dataSource.getConnection();
|
||||||
|
|
||||||
UUID uuid = playerProfile.getUuid();
|
UUID uuid = playerProfile.getUuid();
|
||||||
|
|
||||||
if (playerProfile.getUserId() == -1) {
|
if (playerProfile.getUserId() == -1) {
|
||||||
PreparedStatement saveStatement = con.prepareStatement("INSERT INTO " + PREMIUM_TABLE
|
//User was authenticated with a premium authentication, so it's possible that the player is premium
|
||||||
+ " (UUID, Name, Premium, LastIp) VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
|
if (uuid != null) {
|
||||||
|
updateStmt = con.prepareStatement("UPDATE " + PREMIUM_TABLE
|
||||||
|
+ " SET NAME=?, LastIp=?, LastLogin=CURRENT_TIMESTAMP"
|
||||||
|
+ " WHERE UUID=? AND PREMIUM=1");
|
||||||
|
|
||||||
if (uuid == null) {
|
updateStmt.setString(1, playerProfile.getPlayerName());
|
||||||
saveStatement.setString(1, null);
|
updateStmt.setString(2, playerProfile.getLastIp());
|
||||||
} else {
|
updateStmt.setString(3, uuid.toString().replace("-", ""));
|
||||||
saveStatement.setString(1, uuid.toString().replace("-", ""));
|
|
||||||
|
int affectedRows = updateStmt.executeUpdate();
|
||||||
|
if (affectedRows > 0) {
|
||||||
|
//username changed and we updated the existing database record
|
||||||
|
//so we don't need to run an insert
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
saveStatement.setString(2, playerProfile.getPlayerName());
|
saveStmt = con.prepareStatement("INSERT INTO " + PREMIUM_TABLE
|
||||||
saveStatement.setBoolean(3, playerProfile.isPremium());
|
+ " (UUID, Name, Premium, LastIp) VALUES (?, ?, ?, ?) "
|
||||||
saveStatement.setString(4, playerProfile.getLastIp());
|
, Statement.RETURN_GENERATED_KEYS);
|
||||||
saveStatement.execute();
|
|
||||||
|
|
||||||
ResultSet generatedKeys = saveStatement.getGeneratedKeys();
|
if (uuid == null) {
|
||||||
|
saveStmt.setString(1, null);
|
||||||
|
} else {
|
||||||
|
saveStmt.setString(1, uuid.toString().replace("-", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
saveStmt.setString(2, playerProfile.getPlayerName());
|
||||||
|
saveStmt.setBoolean(3, playerProfile.isPremium());
|
||||||
|
saveStmt.setString(4, playerProfile.getLastIp());
|
||||||
|
|
||||||
|
saveStmt.execute();
|
||||||
|
|
||||||
|
generatedKeys = saveStmt.getGeneratedKeys();
|
||||||
if (generatedKeys != null && generatedKeys.next()) {
|
if (generatedKeys != null && generatedKeys.next()) {
|
||||||
playerProfile.setUserId(generatedKeys.getInt(1));
|
playerProfile.setUserId(generatedKeys.getInt(1));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PreparedStatement saveStatement = con.prepareStatement("UPDATE " + PREMIUM_TABLE
|
saveStmt = con.prepareStatement("UPDATE " + PREMIUM_TABLE
|
||||||
+ " SET UUID=?, Name=?, Premium=?, LastIp=?, LastLogin=CURRENT_TIMESTAMP WHERE UserID=?");
|
+ " SET UUID=?, Name=?, Premium=?, LastIp=?, LastLogin=CURRENT_TIMESTAMP WHERE UserID=?");
|
||||||
|
|
||||||
if (uuid == null) {
|
if (uuid == null) {
|
||||||
saveStatement.setString(1, null);
|
saveStmt.setString(1, null);
|
||||||
} else {
|
} else {
|
||||||
saveStatement.setString(1, uuid.toString().replace("-", ""));
|
saveStmt.setString(1, uuid.toString().replace("-", ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
saveStatement.setString(2, playerProfile.getPlayerName());
|
saveStmt.setString(2, playerProfile.getPlayerName());
|
||||||
saveStatement.setBoolean(3, playerProfile.isPremium());
|
saveStmt.setBoolean(3, playerProfile.isPremium());
|
||||||
saveStatement.setString(4, playerProfile.getLastIp());
|
saveStmt.setString(4, playerProfile.getLastIp());
|
||||||
|
|
||||||
saveStatement.setLong(5, playerProfile.getUserId());
|
saveStmt.setLong(5, playerProfile.getUserId());
|
||||||
saveStatement.execute();
|
saveStmt.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -158,6 +217,9 @@ public class Storage {
|
|||||||
core.getLogger().log(Level.SEVERE, "Failed to save playerProfile", ex);
|
core.getLogger().log(Level.SEVERE, "Failed to save playerProfile", ex);
|
||||||
} finally {
|
} finally {
|
||||||
closeQuietly(con);
|
closeQuietly(con);
|
||||||
|
closeQuietly(updateStmt);
|
||||||
|
closeQuietly(saveStmt);
|
||||||
|
closeQuietly(generatedKeys);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -167,12 +229,12 @@ public class Storage {
|
|||||||
dataSource.close();
|
dataSource.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void closeQuietly(Connection con) {
|
private void closeQuietly(AutoCloseable closeable) {
|
||||||
if (con != null) {
|
if (closeable != null) {
|
||||||
try {
|
try {
|
||||||
con.close();
|
closeable.close();
|
||||||
} catch (SQLException sqlEx) {
|
} catch (Exception closeEx) {
|
||||||
core.getLogger().log(Level.SEVERE, "Failed to close connection", sqlEx);
|
core.getLogger().log(Level.SEVERE, "Failed to close connection", closeEx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,50 @@ autoRegister: false
|
|||||||
# This feature requires Cauldron, Spigot or a fork of Spigot (PaperSpigot, TacoSpigot)
|
# This feature requires Cauldron, Spigot or a fork of Spigot (PaperSpigot, TacoSpigot)
|
||||||
premiumUuid: false
|
premiumUuid: false
|
||||||
|
|
||||||
|
# This will make an additional check (only for player names which are not in the database) against the mojang servers
|
||||||
|
# in order to get the premium UUID. If that premium UUID is in the database, we can assume on sucessful login that the
|
||||||
|
# player changed it's username and we just update the name in the database.
|
||||||
|
# Examples:
|
||||||
|
# #### Case 1
|
||||||
|
# nameChangeCheck = false ----- autoRegister = false
|
||||||
|
#
|
||||||
|
# Player logins as cracked until the player invoked the command /premium. Then we could override the existing database
|
||||||
|
# record.
|
||||||
|
#
|
||||||
|
# #### Case 2
|
||||||
|
#
|
||||||
|
# nameChangeCheck = true ----- autoRegister = false
|
||||||
|
#
|
||||||
|
# Connect the Mojang API and check what UUID the player has (UUID exists => Paid Minecraft account). If that UUID is in
|
||||||
|
# the database it's an **existing player** and FastLogin can **assume** the player is premium and changed the username.
|
||||||
|
# If it's not in the database, it's a new player and **could be a cracked player**. So we just use a offline mode
|
||||||
|
# authentication for this player.
|
||||||
|
#
|
||||||
|
# **Limitation**: Cracked players who uses the new username of a paid account cannot join the server if the database
|
||||||
|
# contains the old name. (Example: The owner of the paid account no longer plays on the server, but changed the username
|
||||||
|
# in the meanwhile).
|
||||||
|
#
|
||||||
|
# #### Case 3
|
||||||
|
#
|
||||||
|
# nameChangeCheck = false ----- autoRegister = true
|
||||||
|
#
|
||||||
|
# We will always request a premium authentication if the username is unknown to us, but is in use by a paid minecraft
|
||||||
|
# account. This means it's kind of a more aggressive check like nameChangeCheck = true and autoRegister = false, because
|
||||||
|
# it request a premium authentication which are completely new to us, that even the premium UUID is not in our database.
|
||||||
|
#
|
||||||
|
# **Limitation**: see below
|
||||||
|
#
|
||||||
|
# #### Case 4
|
||||||
|
#
|
||||||
|
# nameChangeCheck = true ----- autoRegister = true
|
||||||
|
#
|
||||||
|
# Based on autoRegister it checks if the player name is premium and login using a premium authentication. After that
|
||||||
|
# fastlogin receives the premium UUID and can update the database record.
|
||||||
|
#
|
||||||
|
# **Limitation from autoRegister**: New offline players who uses the username of an existing minecraft cannot join the
|
||||||
|
# server.
|
||||||
|
nameChangeCheck: false
|
||||||
|
|
||||||
# If your players have a premium account and a skin associated to their account, this plugin
|
# If your players have a premium account and a skin associated to their account, this plugin
|
||||||
# can download the data and set it to the online player.
|
# can download the data and set it to the online player.
|
||||||
#
|
#
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user