Fixed offline inventory access.

This commit is contained in:
lishid
2014-07-29 06:53:14 -04:00
parent 9271c50a84
commit c2c7996da5
3 changed files with 93 additions and 289 deletions

View File

@@ -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();

View File

@@ -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();

View File

@@ -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.