Fixed offline inventory access.
This commit is contained in:
@@ -17,170 +17,72 @@
|
|||||||
package com.lishid.openinv.internal.v1_7_R3;
|
package com.lishid.openinv.internal.v1_7_R3;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import net.minecraft.util.com.mojang.authlib.GameProfile;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.Plugin;
|
|
||||||
|
|
||||||
import com.lishid.openinv.utils.ReflectionUtil;
|
import com.lishid.openinv.OpenInv;
|
||||||
import com.lishid.openinv.utils.ReflectionUtil.PackageType;
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
import com.lishid.openinv.utils.ReflectionUtil.SubPackageType;
|
import net.minecraft.util.com.mojang.authlib.GameProfile;
|
||||||
|
|
||||||
/**
|
//Volatile
|
||||||
* @author lishid, JuicyDev (reflection)
|
import net.minecraft.server.v1_7_R3.*;
|
||||||
*/
|
|
||||||
public class PlayerDataManager {
|
|
||||||
|
|
||||||
private Plugin plugin;
|
import org.bukkit.craftbukkit.v1_7_R3.*;
|
||||||
private String versionString;
|
|
||||||
private int version;
|
|
||||||
private static String playerFolderName;
|
|
||||||
|
|
||||||
public PlayerDataManager(Plugin plugin) {
|
public class PlayerDataManager implements IPlayerDataManager {
|
||||||
this.plugin = plugin;
|
public Player loadPlayer(String name) {
|
||||||
|
|
||||||
this.versionString = this.plugin
|
|
||||||
.getServer()
|
|
||||||
.getClass()
|
|
||||||
.getPackage()
|
|
||||||
.getName()
|
|
||||||
.substring(
|
|
||||||
this.plugin.getServer().getClass().getPackage()
|
|
||||||
.getName().lastIndexOf('.') + 1);
|
|
||||||
try {
|
try {
|
||||||
this.version = Integer.valueOf(versionString.replace("v", "")
|
UUID uuid = matchUser(name);
|
||||||
.replace("_", "").replace("R", ""));
|
if (uuid == null) {
|
||||||
} catch (NumberFormatException e) { // Fallback
|
return null;
|
||||||
this.version = 173;
|
|
||||||
}
|
|
||||||
playerFolderName = version >= 173 ? "playerdata" : "players";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Default player folder
|
||||||
* @param uuid
|
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "playerdata");
|
||||||
* UUID of the player
|
if (!playerfolder.exists()) {
|
||||||
* @return Instance of the player (null if doesn't exist)
|
|
||||||
*/
|
|
||||||
public Player loadPlayer(UUID uuid) {
|
|
||||||
try {
|
|
||||||
File playerFolder = new File(
|
|
||||||
((World) Bukkit.getWorlds().get(0)).getWorldFolder(),
|
|
||||||
playerFolderName);
|
|
||||||
if (!playerFolder.exists()) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
||||||
if (player == null)
|
if (player == null) {
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
GameProfile profile = new GameProfile(uuid, player.getName());
|
||||||
|
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
||||||
|
// Create an entity to load the player data
|
||||||
|
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), profile, new PlayerInteractManager(server.getWorldServer(0)));
|
||||||
|
|
||||||
GameProfile profile = new GameProfile(player.getUniqueId(),
|
// Get the bukkit entity
|
||||||
player.getName());
|
Player target = (entity == null) ? null : entity.getBukkitEntity();
|
||||||
|
|
||||||
Class<?> obc_CraftServer = ReflectionUtil.getClass("CraftServer",
|
|
||||||
PackageType.CRAFTBUKKIT);
|
|
||||||
Object craftServer = obc_CraftServer.cast(Bukkit.getServer());
|
|
||||||
Method m_getServer = ReflectionUtil.getMethod(obc_CraftServer,
|
|
||||||
"getServer");
|
|
||||||
Class<?> nms_MinecraftServer = ReflectionUtil.getClass(
|
|
||||||
"MinecraftServer", PackageType.MINECRAFT_SERVER);
|
|
||||||
Object minecraftServer = m_getServer.invoke(craftServer);
|
|
||||||
|
|
||||||
Class<?> nms_EntityPlayer = ReflectionUtil.getClass("EntityPlayer",
|
|
||||||
PackageType.MINECRAFT_SERVER);
|
|
||||||
Class<?> nms_WorldServer = ReflectionUtil.getClass("WorldServer",
|
|
||||||
PackageType.MINECRAFT_SERVER);
|
|
||||||
Class<?> nms_PlayerInteractManager = ReflectionUtil.getClass(
|
|
||||||
"PlayerInteractManager", PackageType.MINECRAFT_SERVER);
|
|
||||||
Object worldServer = ReflectionUtil.getMethod(nms_MinecraftServer,
|
|
||||||
"getWorldServer", Integer.class).invoke(minecraftServer, 0);
|
|
||||||
|
|
||||||
Constructor<?> c_EntityPlayer = ReflectionUtil.getConstructor(
|
|
||||||
nms_EntityPlayer, nms_MinecraftServer, nms_WorldServer,
|
|
||||||
GameProfile.class, nms_PlayerInteractManager);
|
|
||||||
Constructor<?> c_PlayerInteractManager = ReflectionUtil
|
|
||||||
.getConstructor(nms_PlayerInteractManager, nms_WorldServer);
|
|
||||||
Object playerInteractManager = c_PlayerInteractManager
|
|
||||||
.newInstance(worldServer);
|
|
||||||
|
|
||||||
Object entityPlayer = c_EntityPlayer.newInstance(minecraftServer,
|
|
||||||
worldServer, profile, playerInteractManager);
|
|
||||||
|
|
||||||
Class<?> obc_CraftPlayer = ReflectionUtil.getClass("CraftPlayer",
|
|
||||||
SubPackageType.ENTITY);
|
|
||||||
Method m_getBukkitEntity = ReflectionUtil.getMethod(
|
|
||||||
nms_EntityPlayer, "getBukkitEntity");
|
|
||||||
|
|
||||||
Player target = entityPlayer == null ? null
|
|
||||||
: (Player) obc_CraftPlayer.cast(m_getBukkitEntity
|
|
||||||
.invoke(entityPlayer));
|
|
||||||
|
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
|
// Load data
|
||||||
target.loadData();
|
target.loadData();
|
||||||
|
// Return the entity
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
catch (Exception e) {
|
||||||
return null;
|
OpenInv.log(e);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param name
|
|
||||||
* Name of the player
|
|
||||||
* @return Instance of the player (null if doesn't exist)
|
|
||||||
*/
|
|
||||||
public Player loadPlayer(String name) {
|
|
||||||
try {
|
|
||||||
UUID uuid = matchUser(name);
|
|
||||||
if (uuid == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
Player target = loadPlayer(uuid);
|
|
||||||
if (target != null) {
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UUID matchUser(String search) {
|
private static UUID matchUser(String search) {
|
||||||
File playerFolder = new File(
|
|
||||||
((World) Bukkit.getWorlds().get(0)).getWorldFolder(),
|
|
||||||
playerFolderName);
|
|
||||||
if (!playerFolder.exists() || !playerFolder.isDirectory())
|
|
||||||
return null;
|
|
||||||
if (search == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
UUID found = null;
|
UUID found = null;
|
||||||
|
|
||||||
String lowerSearch = search.toLowerCase();
|
String lowerSearch = search.toLowerCase();
|
||||||
int delta = 2147483647;
|
int delta = 2147483647;
|
||||||
|
|
||||||
for (File f : playerFolder.listFiles()) {
|
OfflinePlayer[] offlinePlayers = Bukkit.getOfflinePlayers();
|
||||||
if (!f.getName().endsWith(".dat"))
|
for (OfflinePlayer player : offlinePlayers) {
|
||||||
continue;
|
|
||||||
String uuidString = f.getName().substring(0,
|
|
||||||
f.getName().length() - 4);
|
|
||||||
UUID uuid = UUID.fromString(uuidString);
|
|
||||||
|
|
||||||
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
|
||||||
String name = player.getName();
|
String name = player.getName();
|
||||||
|
|
||||||
if (name.equalsIgnoreCase(search))
|
if (name.equalsIgnoreCase(search))
|
||||||
return uuid;
|
return player.getUniqueId();
|
||||||
|
|
||||||
if (name.toLowerCase().startsWith(lowerSearch)) {
|
if (name.toLowerCase().startsWith(lowerSearch)) {
|
||||||
int curDelta = name.length() - lowerSearch.length();
|
int curDelta = name.length() - lowerSearch.length();
|
||||||
|
@@ -17,170 +17,72 @@
|
|||||||
package com.lishid.openinv.internal.v1_7_R4;
|
package com.lishid.openinv.internal.v1_7_R4;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import net.minecraft.util.com.mojang.authlib.GameProfile;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.Plugin;
|
|
||||||
|
|
||||||
import com.lishid.openinv.utils.ReflectionUtil;
|
import com.lishid.openinv.OpenInv;
|
||||||
import com.lishid.openinv.utils.ReflectionUtil.PackageType;
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
import com.lishid.openinv.utils.ReflectionUtil.SubPackageType;
|
import net.minecraft.util.com.mojang.authlib.GameProfile;
|
||||||
|
|
||||||
/**
|
//Volatile
|
||||||
* @author lishid, JuicyDev (reflection)
|
import net.minecraft.server.v1_7_R4.*;
|
||||||
*/
|
|
||||||
public class PlayerDataManager {
|
|
||||||
|
|
||||||
private Plugin plugin;
|
import org.bukkit.craftbukkit.v1_7_R4.*;
|
||||||
private String versionString;
|
|
||||||
private int version;
|
|
||||||
private static String playerFolderName;
|
|
||||||
|
|
||||||
public PlayerDataManager(Plugin plugin) {
|
public class PlayerDataManager implements IPlayerDataManager {
|
||||||
this.plugin = plugin;
|
public Player loadPlayer(String name) {
|
||||||
|
|
||||||
this.versionString = this.plugin
|
|
||||||
.getServer()
|
|
||||||
.getClass()
|
|
||||||
.getPackage()
|
|
||||||
.getName()
|
|
||||||
.substring(
|
|
||||||
this.plugin.getServer().getClass().getPackage()
|
|
||||||
.getName().lastIndexOf('.') + 1);
|
|
||||||
try {
|
try {
|
||||||
this.version = Integer.valueOf(versionString.replace("v", "")
|
UUID uuid = matchUser(name);
|
||||||
.replace("_", "").replace("R", ""));
|
if (uuid == null) {
|
||||||
} catch (NumberFormatException e) { // Fallback
|
return null;
|
||||||
this.version = 173;
|
|
||||||
}
|
|
||||||
playerFolderName = version >= 173 ? "playerdata" : "players";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Default player folder
|
||||||
* @param uuid
|
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "playerdata");
|
||||||
* UUID of the player
|
if (!playerfolder.exists()) {
|
||||||
* @return Instance of the player (null if doesn't exist)
|
|
||||||
*/
|
|
||||||
public Player loadPlayer(UUID uuid) {
|
|
||||||
try {
|
|
||||||
File playerFolder = new File(
|
|
||||||
((World) Bukkit.getWorlds().get(0)).getWorldFolder(),
|
|
||||||
playerFolderName);
|
|
||||||
if (!playerFolder.exists()) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
||||||
if (player == null)
|
if (player == null) {
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
GameProfile profile = new GameProfile(uuid, player.getName());
|
||||||
|
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
||||||
|
// Create an entity to load the player data
|
||||||
|
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), profile, new PlayerInteractManager(server.getWorldServer(0)));
|
||||||
|
|
||||||
GameProfile profile = new GameProfile(player.getUniqueId(),
|
// Get the bukkit entity
|
||||||
player.getName());
|
Player target = (entity == null) ? null : entity.getBukkitEntity();
|
||||||
|
|
||||||
Class<?> obc_CraftServer = ReflectionUtil.getClass("CraftServer",
|
|
||||||
PackageType.CRAFTBUKKIT);
|
|
||||||
Object craftServer = obc_CraftServer.cast(Bukkit.getServer());
|
|
||||||
Method m_getServer = ReflectionUtil.getMethod(obc_CraftServer,
|
|
||||||
"getServer");
|
|
||||||
Class<?> nms_MinecraftServer = ReflectionUtil.getClass(
|
|
||||||
"MinecraftServer", PackageType.MINECRAFT_SERVER);
|
|
||||||
Object minecraftServer = m_getServer.invoke(craftServer);
|
|
||||||
|
|
||||||
Class<?> nms_EntityPlayer = ReflectionUtil.getClass("EntityPlayer",
|
|
||||||
PackageType.MINECRAFT_SERVER);
|
|
||||||
Class<?> nms_WorldServer = ReflectionUtil.getClass("WorldServer",
|
|
||||||
PackageType.MINECRAFT_SERVER);
|
|
||||||
Class<?> nms_PlayerInteractManager = ReflectionUtil.getClass(
|
|
||||||
"PlayerInteractManager", PackageType.MINECRAFT_SERVER);
|
|
||||||
Object worldServer = ReflectionUtil.getMethod(nms_MinecraftServer,
|
|
||||||
"getWorldServer", Integer.class).invoke(minecraftServer, 0);
|
|
||||||
|
|
||||||
Constructor<?> c_EntityPlayer = ReflectionUtil.getConstructor(
|
|
||||||
nms_EntityPlayer, nms_MinecraftServer, nms_WorldServer,
|
|
||||||
GameProfile.class, nms_PlayerInteractManager);
|
|
||||||
Constructor<?> c_PlayerInteractManager = ReflectionUtil
|
|
||||||
.getConstructor(nms_PlayerInteractManager, nms_WorldServer);
|
|
||||||
Object playerInteractManager = c_PlayerInteractManager
|
|
||||||
.newInstance(worldServer);
|
|
||||||
|
|
||||||
Object entityPlayer = c_EntityPlayer.newInstance(minecraftServer,
|
|
||||||
worldServer, profile, playerInteractManager);
|
|
||||||
|
|
||||||
Class<?> obc_CraftPlayer = ReflectionUtil.getClass("CraftPlayer",
|
|
||||||
SubPackageType.ENTITY);
|
|
||||||
Method m_getBukkitEntity = ReflectionUtil.getMethod(
|
|
||||||
nms_EntityPlayer, "getBukkitEntity");
|
|
||||||
|
|
||||||
Player target = entityPlayer == null ? null
|
|
||||||
: (Player) obc_CraftPlayer.cast(m_getBukkitEntity
|
|
||||||
.invoke(entityPlayer));
|
|
||||||
|
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
|
// Load data
|
||||||
target.loadData();
|
target.loadData();
|
||||||
|
// Return the entity
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
catch (Exception e) {
|
||||||
return null;
|
OpenInv.log(e);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param name
|
|
||||||
* Name of the player
|
|
||||||
* @return Instance of the player (null if doesn't exist)
|
|
||||||
*/
|
|
||||||
public Player loadPlayer(String name) {
|
|
||||||
try {
|
|
||||||
UUID uuid = matchUser(name);
|
|
||||||
if (uuid == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
Player target = loadPlayer(uuid);
|
|
||||||
if (target != null) {
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UUID matchUser(String search) {
|
private static UUID matchUser(String search) {
|
||||||
File playerFolder = new File(
|
|
||||||
((World) Bukkit.getWorlds().get(0)).getWorldFolder(),
|
|
||||||
playerFolderName);
|
|
||||||
if (!playerFolder.exists() || !playerFolder.isDirectory())
|
|
||||||
return null;
|
|
||||||
if (search == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
UUID found = null;
|
UUID found = null;
|
||||||
|
|
||||||
String lowerSearch = search.toLowerCase();
|
String lowerSearch = search.toLowerCase();
|
||||||
int delta = 2147483647;
|
int delta = 2147483647;
|
||||||
|
|
||||||
for (File f : playerFolder.listFiles()) {
|
OfflinePlayer[] offlinePlayers = Bukkit.getOfflinePlayers();
|
||||||
if (!f.getName().endsWith(".dat"))
|
for (OfflinePlayer player : offlinePlayers) {
|
||||||
continue;
|
|
||||||
String uuidString = f.getName().substring(0,
|
|
||||||
f.getName().length() - 4);
|
|
||||||
UUID uuid = UUID.fromString(uuidString);
|
|
||||||
|
|
||||||
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
|
||||||
String name = player.getName();
|
String name = player.getName();
|
||||||
|
|
||||||
if (name.equalsIgnoreCase(search))
|
if (name.equalsIgnoreCase(search))
|
||||||
return uuid;
|
return player.getUniqueId();
|
||||||
|
|
||||||
if (name.toLowerCase().startsWith(lowerSearch)) {
|
if (name.toLowerCase().startsWith(lowerSearch)) {
|
||||||
int curDelta = name.length() - lowerSearch.length();
|
int curDelta = name.length() - lowerSearch.length();
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
name: OpenInv
|
name: OpenInv
|
||||||
main: com.lishid.openinv.OpenInv
|
main: com.lishid.openinv.OpenInv
|
||||||
version: 2.1.9
|
version: 2.2.2
|
||||||
author: lishid
|
author: lishid
|
||||||
description: >
|
description: >
|
||||||
This plugin allows you to open a player's inventory as a chest and interact with it in real time.
|
This plugin allows you to open a player's inventory as a chest and interact with it in real time.
|
||||||
|
Reference in New Issue
Block a user