Compare commits

..

11 Commits
2.4.0 ... 2.4.9

Author SHA1 Message Date
Jikoo
1bbdde683c Fixed online matching preventing exact offline access, closes #9
Restored some old OpenInv behavior - Offline name partial completion.
Currently there's no minimum similarity to consider a match a success, and the first name with the same similarity will take precedence. As a result, you may see some very odd results on occasion.
2016-06-15 18:50:38 -04:00
Jikoo
9edac80544 Properly set item arrays for subcontainer
Closes #8
2016-06-12 10:48:03 -04:00
Jikoo
53eadcb821 Backport fix for closing SilentChest not dropping cursor item 2016-06-08 22:38:56 -04:00
Jikoo
326ffdb433 Update for 1.10
Don't load players off the main thread, just in case.
2016-06-08 22:25:14 -04:00
Jikoo
fc5f9587d1 Update for 1.9.4 2016-05-10 15:27:36 -04:00
Jikoo
a929eeeb69 Configuration to disable saving of offline players, bugfixing
Edits made to online players will still work. Edits made to offline players will work if they log in before the ISpecialPlayerInventory is unloaded (currently before the plugin unloads).
Closes #6
Refactored IPlayerDataManager to PlayerDataManager, it's no longer an interface.
Fixed a bug with players' online state initially being inverted
2016-04-18 14:37:21 -04:00
Jikoo
7256494df3 Fix inventories of players on their first login not being openable
Closes #7
2016-04-18 13:05:56 -04:00
Jikoo
1fbaa5b2a9 Reduce redundant saves for ender chests as well
While they don't suffer the same owner-related issues that player inventories did, there's no need to save so many times.
2016-04-11 18:45:23 -04:00
Jikoo
eeb28b4210 Reduce duplicate saves and fix for owner coming online for all versions 2016-04-11 18:12:21 -04:00
Jikoo
0ebe6fe132 Properly update PlayerInventory owner when they come online
Closes #5
2016-04-11 17:59:28 -04:00
Jikoo
e39ab10797 Don't load from player.dat for online players
Fixes lishid#40 and #5
2016-04-11 15:44:25 -04:00
89 changed files with 2625 additions and 565 deletions

View File

@@ -4,9 +4,10 @@ This fork of OpenInv was created when the lag caused by offline player lookups p
### Changes of Note ### Changes of Note
- Removed updater - Removed updater
- Removed wand - Removed wand
- New configuration option `DisableSaving`: Inventory edits will not be saved unless the user is online.
## Previous Versions ## Previous Versions
Any version of Minecraft this fork has been existent for should have a [release](https://github.com/Jikoo/OpenInv/releases) tagged. Features are not backported, however. This fork supports any version after 1.4.5. Binaries are available in the [releases tab](https://github.com/Jikoo/OpenInv/releases). Please allow a brief period after the release of a new version for updates.
## License ## License
``` ```

14
pom.xml
View File

@@ -5,6 +5,20 @@
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<dependencies> <dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.10-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_10_R1</classifier>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.9.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_9_R2</classifier>
</dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>

View File

@@ -34,10 +34,10 @@ import com.lishid.openinv.commands.SearchInvPluginCommand;
import com.lishid.openinv.commands.SilentChestPluginCommand; import com.lishid.openinv.commands.SilentChestPluginCommand;
import com.lishid.openinv.internal.IAnySilentChest; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.internal.InternalAccessor;
import com.lishid.openinv.internal.PlayerDataManager;
/** /**
* Open other player's inventory * Open other player's inventory
@@ -50,7 +50,7 @@ public class OpenInv extends JavaPlugin {
private final Map<String, ISpecialEnderChest> enderChests = new HashMap<String, ISpecialEnderChest>(); private final Map<String, ISpecialEnderChest> enderChests = new HashMap<String, ISpecialEnderChest>();
private InternalAccessor accessor; private InternalAccessor accessor;
private IPlayerDataManager playerLoader; private PlayerDataManager playerLoader;
private IInventoryAccess inventoryAccess; private IInventoryAccess inventoryAccess;
private IAnySilentChest anySilentChest; private IAnySilentChest anySilentChest;
@@ -73,12 +73,26 @@ public class OpenInv extends JavaPlugin {
anySilentChest = accessor.newAnySilentChest(); anySilentChest = accessor.newAnySilentChest();
FileConfiguration config = getConfig(); FileConfiguration config = getConfig();
config.set("NotifySilentChest", config.getBoolean("NotifySilentChest", true)); boolean dirtyConfig = false;
config.set("NotifyAnyChest", config.getBoolean("NotifyAnyChest", true)); if (!config.isBoolean("NotifySilentChest")) {
config.set("NotifySilentChest", true);
dirtyConfig = true;
}
if (!config.isBoolean("NotifyAnyChest")) {
config.set("NotifyAnyChest", true);
dirtyConfig = true;
}
if (!config.isBoolean("DisableSaving")) {
config.set("DisableSaving", false);
dirtyConfig = true;
}
config.addDefault("NotifySilentChest", true); config.addDefault("NotifySilentChest", true);
config.addDefault("NotifyAnyChest", true); config.addDefault("NotifyAnyChest", true);
config.addDefault("DisableSaving", false);
config.options().copyDefaults(true); config.options().copyDefaults(true);
saveConfig(); if (dirtyConfig) {
saveConfig();
}
pm.registerEvents(new OpenInvPlayerListener(this), this); pm.registerEvents(new OpenInvPlayerListener(this), this);
pm.registerEvents(new OpenInvInventoryListener(this), this); pm.registerEvents(new OpenInvInventoryListener(this), this);
@@ -95,7 +109,7 @@ public class OpenInv extends JavaPlugin {
return this.accessor; return this.accessor;
} }
public IPlayerDataManager getPlayerLoader() { public PlayerDataManager getPlayerLoader() {
return this.playerLoader; return this.playerLoader;
} }
@@ -115,12 +129,12 @@ public class OpenInv extends JavaPlugin {
return null; return null;
} }
public ISpecialPlayerInventory getOrCreateInventoryFor(Player player, boolean offline) { public ISpecialPlayerInventory getOrCreateInventoryFor(Player player, boolean online) {
String id = getPlayerLoader().getPlayerDataID(player); String id = getPlayerLoader().getPlayerDataID(player);
if (inventories.containsKey(id)) { if (inventories.containsKey(id)) {
return inventories.get(id); return inventories.get(id);
} }
ISpecialPlayerInventory inv = getInternalAccessor().newSpecialPlayerInventory(player, offline); ISpecialPlayerInventory inv = getInternalAccessor().newSpecialPlayerInventory(player, online);
inventories.put(id, inv); inventories.put(id, inv);
return inv; return inv;
} }
@@ -140,12 +154,12 @@ public class OpenInv extends JavaPlugin {
return null; return null;
} }
public ISpecialEnderChest getOrCreateEnderChestFor(Player player, boolean offline) { public ISpecialEnderChest getOrCreateEnderChestFor(Player player, boolean online) {
String id = getPlayerLoader().getPlayerDataID(player); String id = getPlayerLoader().getPlayerDataID(player);
if (enderChests.containsKey(id)) { if (enderChests.containsKey(id)) {
return enderChests.get(id); return enderChests.get(id);
} }
ISpecialEnderChest inv = getInternalAccessor().newSpecialEnderChest(player, offline); ISpecialEnderChest inv = getInternalAccessor().newSpecialEnderChest(player, online);
enderChests.put(id, inv); enderChests.put(id, inv);
return inv; return inv;
} }
@@ -157,6 +171,10 @@ public class OpenInv extends JavaPlugin {
} }
} }
public boolean disableSaving() {
return getConfig().getBoolean("DisableSaving", false);
}
public boolean notifySilentChest() { public boolean notifySilentChest() {
return getConfig().getBoolean("NotifySilentChest", true); return getConfig().getBoolean("NotifySilentChest", true);
} }
@@ -165,15 +183,6 @@ public class OpenInv extends JavaPlugin {
return getConfig().getBoolean("NotifyAnyChest", true); return getConfig().getBoolean("NotifyAnyChest", true);
} }
public boolean getPlayerItemOpenInvStatus(OfflinePlayer player) {
return getConfig().getBoolean("ItemOpenInv." + getPlayerLoader().getPlayerDataID(player) + ".toggle", false);
}
public void setPlayerItemOpenInvStatus(OfflinePlayer player, boolean status) {
getConfig().set("ItemOpenInv." + getPlayerLoader().getPlayerDataID(player) + ".toggle", status);
saveConfig();
}
public boolean getPlayerSilentChestStatus(OfflinePlayer player) { public boolean getPlayerSilentChestStatus(OfflinePlayer player) {
return getConfig().getBoolean("SilentChest." + getPlayerLoader().getPlayerDataID(player) + ".toggle", false); return getConfig().getBoolean("SilentChest." + getPlayerLoader().getPlayerDataID(player) + ".toggle", false);
} }
@@ -192,6 +201,72 @@ public class OpenInv extends JavaPlugin {
saveConfig(); saveConfig();
} }
/**
* Get an OfflinePlayer by name.
*
* @param name the name of the Player
* @return the OfflinePlayer, or null if no players have ever logged in
*/
public OfflinePlayer matchPlayer(String name) {
// Warn if called on the main thread - if we resort to searching offline players, this may take several seconds.
if (getServer().isPrimaryThread()) {
getLogger().warning("Call to OpenInv#matchPlayer made on the main thread!");
getLogger().warning("This can cause the server to hang, potentially severely.");
getLogger().warning("Trace:");
for (StackTraceElement element : new Throwable().fillInStackTrace().getStackTrace()) {
getLogger().warning(element.toString());
}
}
OfflinePlayer player = getServer().getPlayerExact(name);
if (player != null) {
return player;
}
player = getServer().getOfflinePlayer(name);
/*
* Compatibility: Pre-UUID, getOfflinePlayer always returns an OfflinePlayer. Post-UUID,
* getOfflinePlayer will return null if no matching player is found. To preserve
* compatibility, only return the player if they have played before. Ignoring current online
* status is fine, they'd have been found by getPlayerExact otherwise.
*/
if (player != null && player.hasPlayedBefore()) {
return player;
}
player = getServer().getPlayer(name);
if (player != null) {
return player;
}
int bestMatch = Integer.MAX_VALUE;
for (OfflinePlayer offline : getServer().getOfflinePlayers()) {
if (offline.getName() == null) {
// Loaded by UUID only, name has never been looked up.
continue;
}
// Compatibility: Lang3 is only bundled with 1.8+
int currentMatch = org.apache.commons.lang.StringUtils.getLevenshteinDistance(name, offline.getName());
if (currentMatch == 0) {
return offline;
}
if (currentMatch < bestMatch) {
bestMatch = currentMatch;
player = offline;
}
}
// Only null if no players have played ever, otherwise even the worst match will do.
return player;
}
public static void ShowHelp(Player player) { public static void ShowHelp(Player player) {
player.sendMessage(ChatColor.GREEN + "/openinv <Player> - Open a player's inventory"); player.sendMessage(ChatColor.GREEN + "/openinv <Player> - Open a player's inventory");
player.sendMessage(ChatColor.GREEN + " (aliases: oi, inv, open)"); player.sendMessage(ChatColor.GREEN + " (aliases: oi, inv, open)");

View File

@@ -32,13 +32,9 @@ public class OpenInvInventoryListener implements Listener {
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onInventoryClick(InventoryClickEvent event) { public void onInventoryClick(InventoryClickEvent event) {
// If this is the top inventory
// if (event.getView().convertSlot(event.getRawSlot()) == event.getRawSlot())
// {
if (!plugin.getInventoryAccess().check(event.getInventory(), event.getWhoClicked())) { if (!plugin.getInventoryAccess().check(event.getInventory(), event.getWhoClicked())) {
event.setCancelled(true); event.setCancelled(true);
} }
// }
} }
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)

View File

@@ -27,6 +27,7 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.scheduler.BukkitRunnable;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
@@ -39,19 +40,25 @@ public class OpenInvPlayerListener implements Listener {
this.plugin = plugin; this.plugin = plugin;
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(final PlayerJoinEvent event) {
ISpecialPlayerInventory inventory = plugin.getInventoryFor(event.getPlayer()); new BukkitRunnable() {
@Override
if (inventory != null) { public void run() {
inventory.setPlayerOnline(event.getPlayer()); if (!event.getPlayer().isOnline()) {
} return;
}
ISpecialEnderChest chest = plugin.getEnderChestFor(event.getPlayer()); ISpecialPlayerInventory inventory = plugin.getInventoryFor(event.getPlayer());
if (inventory != null) {
if (chest != null) { inventory.setPlayerOnline(event.getPlayer());
chest.setPlayerOnline(event.getPlayer()); event.getPlayer().updateInventory();
} }
ISpecialEnderChest chest = plugin.getEnderChestFor(event.getPlayer());
if (chest != null) {
chest.setPlayerOnline(event.getPlayer());
}
}
}.runTask(plugin);
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)

View File

@@ -17,9 +17,7 @@
package com.lishid.openinv.commands; package com.lishid.openinv.commands;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@@ -40,6 +38,7 @@ public class OpenEnderPluginCommand implements CommandExecutor {
this.plugin = plugin; this.plugin = plugin;
} }
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "You can't use this from the console."); sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
@@ -72,22 +71,17 @@ public class OpenEnderPluginCommand implements CommandExecutor {
} }
new BukkitRunnable() { new BukkitRunnable() {
@Override
public void run() { public void run() {
List<Player> matches = Bukkit.matchPlayer(name); final OfflinePlayer offlinePlayer = plugin.matchPlayer(name);
final OfflinePlayer offlinePlayer;
if (!matches.isEmpty()) { if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore() && !offlinePlayer.isOnline()) {
offlinePlayer = matches.get(0);
} else {
offlinePlayer = Bukkit.getOfflinePlayer(name);
}
if (!player.isOnline()) {
return;
}
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) {
player.sendMessage(ChatColor.RED + "Player not found!"); player.sendMessage(ChatColor.RED + "Player not found!");
return; return;
} }
new BukkitRunnable() { new BukkitRunnable() {
@Override
public void run() { public void run() {
if (!player.isOnline()) { if (!player.isOnline()) {
return; return;
@@ -95,6 +89,7 @@ public class OpenEnderPluginCommand implements CommandExecutor {
openInventory(player, offlinePlayer); openInventory(player, offlinePlayer);
} }
}.runTask(plugin); }.runTask(plugin);
} }
}.runTaskAsynchronously(plugin); }.runTaskAsynchronously(plugin);
@@ -104,9 +99,11 @@ public class OpenEnderPluginCommand implements CommandExecutor {
private void openInventory(Player player, OfflinePlayer target) { private void openInventory(Player player, OfflinePlayer target) {
Player onlineTarget; Player onlineTarget;
if (!target.isOnline()) { boolean online = target.isOnline();
if (!online) {
// Try loading the player's data // Try loading the player's data
onlineTarget = plugin.getPlayerLoader().loadPlayer(target); onlineTarget = plugin.getPlayerLoader().loadPlayer(plugin, target);
if (onlineTarget == null) { if (onlineTarget == null) {
player.sendMessage(ChatColor.RED + "Player not found!"); player.sendMessage(ChatColor.RED + "Player not found!");
@@ -126,7 +123,7 @@ public class OpenEnderPluginCommand implements CommandExecutor {
openEnderHistory.put(player, onlineTarget.getName()); openEnderHistory.put(player, onlineTarget.getName());
// Create the inventory // Create the inventory
ISpecialEnderChest chest = plugin.getOrCreateEnderChestFor(onlineTarget, !target.isOnline()); ISpecialEnderChest chest = plugin.getOrCreateEnderChestFor(onlineTarget, online);
// Open the inventory // Open the inventory
player.openInventory(chest.getBukkitInventory()); player.openInventory(chest.getBukkitInventory());

View File

@@ -17,9 +17,7 @@
package com.lishid.openinv.commands; package com.lishid.openinv.commands;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@@ -40,6 +38,7 @@ public class OpenInvPluginCommand implements CommandExecutor {
this.plugin = plugin; this.plugin = plugin;
} }
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "You can't use this from the console."); sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
@@ -72,22 +71,17 @@ public class OpenInvPluginCommand implements CommandExecutor {
} }
new BukkitRunnable() { new BukkitRunnable() {
@Override
public void run() { public void run() {
List<Player> matches = Bukkit.matchPlayer(name); final OfflinePlayer offlinePlayer = plugin.matchPlayer(name);
final OfflinePlayer offlinePlayer;
if (!matches.isEmpty()) { if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore() && !offlinePlayer.isOnline()) {
offlinePlayer = matches.get(0);
} else {
offlinePlayer = Bukkit.getOfflinePlayer(name);
}
if (!player.isOnline()) {
return;
}
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) {
player.sendMessage(ChatColor.RED + "Player not found!"); player.sendMessage(ChatColor.RED + "Player not found!");
return; return;
} }
new BukkitRunnable() { new BukkitRunnable() {
@Override
public void run() { public void run() {
if (!player.isOnline()) { if (!player.isOnline()) {
return; return;
@@ -95,6 +89,7 @@ public class OpenInvPluginCommand implements CommandExecutor {
openInventory(player, offlinePlayer); openInventory(player, offlinePlayer);
} }
}.runTask(plugin); }.runTask(plugin);
} }
}.runTaskAsynchronously(plugin); }.runTaskAsynchronously(plugin);
@@ -105,10 +100,11 @@ public class OpenInvPluginCommand implements CommandExecutor {
Player onlineTarget; Player onlineTarget;
boolean online = target.isOnline();
if (!target.isOnline()) { if (!online) {
// Try loading the player's data // Try loading the player's data
onlineTarget = plugin.getPlayerLoader().loadPlayer(target); onlineTarget = plugin.getPlayerLoader().loadPlayer(plugin, target);
if (onlineTarget == null) { if (onlineTarget == null) {
player.sendMessage(ChatColor.RED + "Player not found!"); player.sendMessage(ChatColor.RED + "Player not found!");
@@ -140,7 +136,7 @@ public class OpenInvPluginCommand implements CommandExecutor {
openInvHistory.put(player, onlineTarget.getName()); openInvHistory.put(player, onlineTarget.getName());
// Create the inventory // Create the inventory
ISpecialPlayerInventory inv = plugin.getOrCreateInventoryFor(onlineTarget, !target.isOnline()); ISpecialPlayerInventory inv = plugin.getOrCreateInventoryFor(onlineTarget, online);
// Open the inventory // Open the inventory
player.openInventory(inv.getBukkitInventory()); player.openInventory(inv.getBukkitInventory());

View File

@@ -1,26 +0,0 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
public interface IPlayerDataManager {
public Player loadPlayer(OfflinePlayer offline);
public String getPlayerDataID(OfflinePlayer player);
}

View File

@@ -23,9 +23,9 @@ public interface ISpecialEnderChest {
public Inventory getBukkitInventory(); public Inventory getBukkitInventory();
public boolean inventoryRemovalCheck(); public boolean inventoryRemovalCheck(boolean save);
public void setPlayerOnline(Player p); public void setPlayerOnline(Player player);
/** /**
* Sets the Player associated with this ISpecialEnderChest offline. * Sets the Player associated with this ISpecialEnderChest offline.

View File

@@ -23,7 +23,7 @@ public interface ISpecialPlayerInventory {
public Inventory getBukkitInventory(); public Inventory getBukkitInventory();
public boolean inventoryRemovalCheck(); public boolean inventoryRemovalCheck(boolean save);
public void setPlayerOnline(Player player); public void setPlayerOnline(Player player);

View File

@@ -55,8 +55,8 @@ public class InternalAccessor {
plugin.getLogger().warning("OpenInv encountered an error with the CraftBukkit version \"" + version + "\". Please look for an updated version of OpenInv."); plugin.getLogger().warning("OpenInv encountered an error with the CraftBukkit version \"" + version + "\". Please look for an updated version of OpenInv.");
} }
public IPlayerDataManager newPlayerDataManager() { public PlayerDataManager newPlayerDataManager() {
return (IPlayerDataManager) createObject(IPlayerDataManager.class, "PlayerDataManager"); return (PlayerDataManager) createObject(PlayerDataManager.class, "PlayerDataManager");
} }
public IInventoryAccess newInventoryAccess() { public IInventoryAccess newInventoryAccess() {
@@ -71,7 +71,9 @@ public class InternalAccessor {
try { try {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialPlayerInventory"); Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialPlayerInventory");
if (ISpecialPlayerInventory.class.isAssignableFrom(internalClass)) { if (ISpecialPlayerInventory.class.isAssignableFrom(internalClass)) {
return (ISpecialPlayerInventory) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline); return (ISpecialPlayerInventory) internalClass
.getConstructor(OpenInv.class, Player.class, Boolean.class)
.newInstance(this.plugin, player, offline);
} }
} }
catch (Exception e) { catch (Exception e) {
@@ -86,7 +88,9 @@ public class InternalAccessor {
try { try {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialEnderChest"); Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialEnderChest");
if (ISpecialEnderChest.class.isAssignableFrom(internalClass)) { if (ISpecialEnderChest.class.isAssignableFrom(internalClass)) {
return (ISpecialEnderChest) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline); return (ISpecialEnderChest) internalClass
.getConstructor(OpenInv.class, Player.class, Boolean.class)
.newInstance(this.plugin, player, offline);
} }
} }
catch (Exception e) { catch (Exception e) {

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public abstract class PlayerDataManager {
public final Player loadPlayer(final Plugin plugin, final OfflinePlayer offline) {
if (offline.isOnline()) {
return offline.getPlayer();
}
if (Bukkit.isPrimaryThread()) {
return this.loadOfflinePlayer(offline);
}
Future<Player> future = Bukkit.getScheduler().callSyncMethod(plugin,
new Callable<Player>() {
@Override
public Player call() throws Exception {
return loadOfflinePlayer(offline);
}
});
int ticks = 0;
while (!future.isDone() && !future.isCancelled() && ticks < 10) {
++ticks;
try {
Thread.sleep(50L);
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
if (!future.isDone() || future.isCancelled()) {
return null;
}
try {
return future.get();
} catch (InterruptedException e) {
e.printStackTrace();
return null;
} catch (ExecutionException e) {
e.printStackTrace();
return null;
}
}
protected abstract Player loadOfflinePlayer(OfflinePlayer offline);
public abstract String getPlayerDataID(OfflinePlayer player);
}

View File

@@ -0,0 +1,144 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_10_R1;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IAnySilentChest;
// Volatile
import net.minecraft.server.v1_10_R1.AxisAlignedBB;
import net.minecraft.server.v1_10_R1.Block;
import net.minecraft.server.v1_10_R1.BlockPosition;
import net.minecraft.server.v1_10_R1.Entity;
import net.minecraft.server.v1_10_R1.EntityOcelot;
import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.IInventory;
import net.minecraft.server.v1_10_R1.ITileInventory;
import net.minecraft.server.v1_10_R1.InventoryLargeChest;
import net.minecraft.server.v1_10_R1.PacketPlayOutOpenWindow;
import net.minecraft.server.v1_10_R1.TileEntityChest;
import net.minecraft.server.v1_10_R1.World;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
public class AnySilentChest implements IAnySilentChest {
@Override
public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
// If block or ocelot on top
if (world.getType(new BlockPosition(x, y + 1, z)).l() || hasOcelotOnTop(world, x, y, z))
return true;
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
// If block next to chest is chest and has a block or ocelot on top
if (isBlockedChest(world, id, x - 1, y, z))
return true;
if (isBlockedChest(world, id, x + 1, y, z))
return true;
if (isBlockedChest(world, id, x, y, z - 1))
return true;
if (isBlockedChest(world, id, x, y, z + 1))
return true;
return false;
}
private boolean isBlockedChest(World world, int id, int x, int y, int z) {
BlockPosition position = new BlockPosition(x, y, z);
if (Block.getId(world.getType(position).getBlock()) != id) {
return false;
}
if (world.getType(position).l()) {
return true;
}
return hasOcelotOnTop(world, x, y, z);
}
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
for (Entity localEntity : world.a(EntityOcelot.class,
new AxisAlignedBB(x, y + 1, z, x + 1, y + 2, z + 1))) {
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
if (localEntityOcelot.isSitting()) {
return true;
}
}
return false;
}
@Override
public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(new BlockPosition(x, y, z));
if (chest == null)
return true;
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
if (!anychest) {
if (world.getType(new BlockPosition(x, y + 1, z)).l())
return true;
if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).l()))
return true;
if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).l()))
return true;
if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).l()))
return true;
if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).l()))
return true;
}
if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
boolean returnValue = true;
if (!silentchest) {
player.openContainer((IInventory) chest);
}
else {
try {
SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
player.activeContainer = silentContainerChest;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = false;
}
catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
}
return returnValue;
}
}

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_10_R1;
import java.lang.reflect.Field;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess;
// Volatile
import net.minecraft.server.v1_10_R1.IInventory;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
@Override
public boolean check(Inventory inventory, HumanEntity player) {
IInventory inv = grabInventory(inventory);
if (inv instanceof SpecialPlayerInventory) {
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false;
}
}
else if (inv instanceof SpecialEnderChest) {
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
return false;
}
}
return true;
}
private IInventory grabInventory(Inventory inventory) {
if(inventory instanceof CraftInventory) {
return ((CraftInventory) inventory).getInventory();
}
//Use reflection to find the iinventory
Class<? extends Inventory> clazz = inventory.getClass();
IInventory result = null;
for(Field f : clazz.getDeclaredFields()) {
f.setAccessible(true);
if(IInventory.class.isAssignableFrom(f.getDeclaringClass())) {
try {
result = (IInventory) f.get(inventory);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_10_R1;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.mojang.authlib.GameProfile;
// Volatile
import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.MinecraftServer;
import net.minecraft.server.v1_10_R1.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_10_R1.CraftServer;
public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override
public Player loadOfflinePlayer(OfflinePlayer offline) {
if (offline == null || !offline.hasPlayedBefore()) {
return null;
}
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.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)));
// Get the bukkit entity
Player target = (entity == null) ? null : entity.getBukkitEntity();
if (target != null) {
// Load data
target.loadData();
// Return the entity
return target;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getUniqueId().toString();
}
}

View File

@@ -0,0 +1,45 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_10_R1;
// Volatile
import net.minecraft.server.v1_10_R1.ContainerChest;
import net.minecraft.server.v1_10_R1.EntityHuman;
import net.minecraft.server.v1_10_R1.IInventory;
import net.minecraft.server.v1_10_R1.PlayerInventory;
public class SilentContainerChest extends ContainerChest {
public IInventory inv;
public SilentContainerChest(IInventory i1, IInventory i2, EntityHuman e1) {
super(i1, i2, e1);
inv = i2;
// close signal
inv.closeContainer(e1);
}
@Override
public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
}
}

View File

@@ -0,0 +1,167 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_10_R1;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile
import net.minecraft.server.v1_10_R1.EntityHuman;
import net.minecraft.server.v1_10_R1.IInventory;
import net.minecraft.server.v1_10_R1.InventoryEnderChest;
import net.minecraft.server.v1_10_R1.InventorySubcontainer;
import net.minecraft.server.v1_10_R1.ItemStack;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftHumanEntity;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
private CraftPlayer owner;
private int maxStack = MAX_STACK;
public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest();
this.owner = player;
setItemArrays(this, enderChest.getContents());
}
private void setItemArrays(InventorySubcontainer subcontainer, ItemStack[] items) {
try {
// Prepare to remove final modifier
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
// Access and replace main inventory array
Field field = InventorySubcontainer.class.getField("items");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(subcontainer, items);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public Inventory getBukkitInventory() {
return inventory;
}
@Override
public boolean inventoryRemovalCheck(boolean save) {
boolean offline = transaction.isEmpty() && !playerOnline;
if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
}
@Override
public void setPlayerOnline(Player player) {
if (!playerOnline) {
try {
owner = (CraftPlayer) player;
setItemArrays(owner.getHandle().getEnderChest(), this.items);
}
catch (Exception e) {}
playerOnline = true;
}
}
@Override
public boolean setPlayerOffline() {
playerOnline = false;
return inventoryRemovalCheck(false);
}
@Override
public ItemStack[] getContents() {
return this.items;
}
@Override
public void onOpen(CraftHumanEntity who) {
transaction.add(who);
}
@Override
public void onClose(CraftHumanEntity who) {
transaction.remove(who);
this.inventoryRemovalCheck(true);
}
@Override
public List<HumanEntity> getViewers() {
return transaction;
}
@Override
public InventoryHolder getOwner() {
return this.owner;
}
@Override
public void setMaxStackSize(int size) {
maxStack = size;
}
@Override
public int getMaxStackSize() {
return maxStack;
}
@Override
public boolean a(EntityHuman entityhuman) {
return true;
}
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -0,0 +1,321 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_10_R1;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
import net.minecraft.server.v1_10_R1.EntityHuman;
import net.minecraft.server.v1_10_R1.ItemStack;
import net.minecraft.server.v1_10_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftHumanEntity;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[4];
private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p);
this.playerOnline = online;
setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots);
}
private void setItemArrays(PlayerInventory inventory, ItemStack[] items, ItemStack[] armor,
ItemStack[] extraSlots) {
try {
// Prepare to remove final modifier
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
// Access and replace main inventory array
Field field = PlayerInventory.class.getField("items");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, items);
// Access and replace armor inventory array
field = PlayerInventory.class.getField("armor");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, armor);
// Access and replace offhand inventory array
field = PlayerInventory.class.getField("extraSlots");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, extraSlots);
// Access and replace array containing all inventory arrays
field = PlayerInventory.class.getDeclaredField("g");
field.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, new ItemStack[][] { items, armor, extraSlots });
} catch (NoSuchFieldException e) {
// Unable to set final fields to item arrays, we're screwed. Noisily fail.
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public Inventory getBukkitInventory() {
return inventory;
}
@Override
public boolean inventoryRemovalCheck(boolean save) {
boolean offline = transaction.isEmpty() && !playerOnline;
if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
}
@Override
public void setPlayerOnline(Player player) {
if (!playerOnline) {
owner = (CraftPlayer) player;
this.player = owner.getHandle();
setItemArrays(this.player.inventory, items, armor, extraSlots);
playerOnline = true;
}
}
@Override
public boolean setPlayerOffline() {
playerOnline = false;
return this.inventoryRemovalCheck(false);
}
@Override
public void onClose(CraftHumanEntity who) {
super.onClose(who);
this.inventoryRemovalCheck(true);
}
@Override
public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(armor, 0, C, items.length, armor.length);
System.arraycopy(extraSlots, 0, C, items.length + armor.length, extraSlots.length);
return C;
}
@Override
public int getSize() {
return super.getSize() + 5;
}
@Override
public ItemStack getItem(int i) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
// extraSlots is, for now, just an array with length 1. No need for special handling.
return is[i];
}
@Override
public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
if (is[i] != null) {
ItemStack itemstack;
if (is[i].count <= j) {
itemstack = is[i];
is[i] = null;
return itemstack;
}
else {
itemstack = is[i].cloneAndSubtract(j);
if (is[i].count == 0) {
is[i] = null;
}
return itemstack;
}
}
else {
return null;
}
}
@Override
public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
if (is[i] != null) {
ItemStack itemstack = is[i];
is[i] = null;
return itemstack;
}
else {
return null;
}
}
@Override
public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
// Effects
if (is == this.extra) {
owner.getHandle().drop(itemstack, true);
itemstack = null;
}
is[i] = itemstack;
owner.getHandle().defaultContainer.b();
}
private int getReversedItemSlotNum(int i) {
if (i >= 27)
return i - 27;
else
return i + 9;
}
private int getReversedArmorSlotNum(int i) {
if (i == 0)
return 3;
if (i == 1)
return 2;
if (i == 2)
return 1;
if (i == 3)
return 0;
else
return i;
}
@Override
public String getName() {
if (player.getName().length() > 16) {
return player.getName().substring(0, 16);
}
return player.getName();
}
@Override
public boolean a(EntityHuman entityhuman) {
return true;
}
}

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_4_5.EntityPlayer; import net.minecraft.server.v1_4_5.EntityPlayer;
import net.minecraft.server.v1_4_5.ItemInWorldManager; import net.minecraft.server.v1_4_5.ItemInWorldManager;
@@ -29,10 +27,10 @@ import net.minecraft.server.v1_4_5.MinecraftServer;
import org.bukkit.craftbukkit.v1_4_5.CraftServer; import org.bukkit.craftbukkit.v1_4_5.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_4_5;
import net.minecraft.server.v1_4_5.ContainerChest; import net.minecraft.server.v1_4_5.ContainerChest;
import net.minecraft.server.v1_4_5.EntityHuman; import net.minecraft.server.v1_4_5.EntityHuman;
import net.minecraft.server.v1_4_5.IInventory; import net.minecraft.server.v1_4_5.IInventory;
import net.minecraft.server.v1_4_5.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_4_5;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_4_6.EntityPlayer; import net.minecraft.server.v1_4_6.EntityPlayer;
import net.minecraft.server.v1_4_6.MinecraftServer; import net.minecraft.server.v1_4_6.MinecraftServer;
@@ -29,10 +27,10 @@ import net.minecraft.server.v1_4_6.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_4_6.CraftServer; import org.bukkit.craftbukkit.v1_4_6.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_4_6;
import net.minecraft.server.v1_4_6.ContainerChest; import net.minecraft.server.v1_4_6.ContainerChest;
import net.minecraft.server.v1_4_6.EntityHuman; import net.minecraft.server.v1_4_6.EntityHuman;
import net.minecraft.server.v1_4_6.IInventory; import net.minecraft.server.v1_4_6.IInventory;
import net.minecraft.server.v1_4_6.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_4_6;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
import net.minecraft.server.v1_4_R1.EntityPlayer; import net.minecraft.server.v1_4_R1.EntityPlayer;
import net.minecraft.server.v1_4_R1.MinecraftServer; import net.minecraft.server.v1_4_R1.MinecraftServer;
import net.minecraft.server.v1_4_R1.PlayerInteractManager; import net.minecraft.server.v1_4_R1.PlayerInteractManager;
@@ -30,10 +28,10 @@ import net.minecraft.server.v1_4_R1.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_4_R1.CraftServer; import org.bukkit.craftbukkit.v1_4_R1.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_4_R1;
import net.minecraft.server.v1_4_R1.ContainerChest; import net.minecraft.server.v1_4_R1.ContainerChest;
import net.minecraft.server.v1_4_R1.EntityHuman; import net.minecraft.server.v1_4_R1.EntityHuman;
import net.minecraft.server.v1_4_R1.IInventory; import net.minecraft.server.v1_4_R1.IInventory;
import net.minecraft.server.v1_4_R1.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
// Volatile // Volatile
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_4_R1;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import net.minecraft.server.v1_4_R1.EntityHuman; import net.minecraft.server.v1_4_R1.EntityHuman;
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_5_R2.EntityPlayer; import net.minecraft.server.v1_5_R2.EntityPlayer;
import net.minecraft.server.v1_5_R2.MinecraftServer; import net.minecraft.server.v1_5_R2.MinecraftServer;
@@ -29,10 +27,10 @@ import net.minecraft.server.v1_5_R2.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_5_R2.CraftServer; import org.bukkit.craftbukkit.v1_5_R2.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_5_R2;
import net.minecraft.server.v1_5_R2.ContainerChest; import net.minecraft.server.v1_5_R2.ContainerChest;
import net.minecraft.server.v1_5_R2.EntityHuman; import net.minecraft.server.v1_5_R2.EntityHuman;
import net.minecraft.server.v1_5_R2.IInventory; import net.minecraft.server.v1_5_R2.IInventory;
import net.minecraft.server.v1_5_R2.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_5_R2;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_5_R3.EntityPlayer; import net.minecraft.server.v1_5_R3.EntityPlayer;
import net.minecraft.server.v1_5_R3.MinecraftServer; import net.minecraft.server.v1_5_R3.MinecraftServer;
@@ -29,10 +27,10 @@ import net.minecraft.server.v1_5_R3.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_5_R3.CraftServer; import org.bukkit.craftbukkit.v1_5_R3.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_5_R3;
import net.minecraft.server.v1_5_R3.ContainerChest; import net.minecraft.server.v1_5_R3.ContainerChest;
import net.minecraft.server.v1_5_R3.EntityHuman; import net.minecraft.server.v1_5_R3.EntityHuman;
import net.minecraft.server.v1_5_R3.IInventory; import net.minecraft.server.v1_5_R3.IInventory;
import net.minecraft.server.v1_5_R3.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_5_R3;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_6_R1.EntityPlayer; import net.minecraft.server.v1_6_R1.EntityPlayer;
import net.minecraft.server.v1_6_R1.MinecraftServer; import net.minecraft.server.v1_6_R1.MinecraftServer;
@@ -29,10 +27,10 @@ import net.minecraft.server.v1_6_R1.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R1.CraftServer; import org.bukkit.craftbukkit.v1_6_R1.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_6_R1;
import net.minecraft.server.v1_6_R1.ContainerChest; import net.minecraft.server.v1_6_R1.ContainerChest;
import net.minecraft.server.v1_6_R1.EntityHuman; import net.minecraft.server.v1_6_R1.EntityHuman;
import net.minecraft.server.v1_6_R1.IInventory; import net.minecraft.server.v1_6_R1.IInventory;
import net.minecraft.server.v1_6_R1.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_6_R1;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -32,13 +33,16 @@ import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -51,18 +55,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -70,13 +77,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_6_R2.EntityPlayer; import net.minecraft.server.v1_6_R2.EntityPlayer;
import net.minecraft.server.v1_6_R2.MinecraftServer; import net.minecraft.server.v1_6_R2.MinecraftServer;
@@ -29,10 +27,10 @@ import net.minecraft.server.v1_6_R2.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R2.CraftServer; import org.bukkit.craftbukkit.v1_6_R2.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_6_R2;
import net.minecraft.server.v1_6_R2.ContainerChest; import net.minecraft.server.v1_6_R2.ContainerChest;
import net.minecraft.server.v1_6_R2.EntityHuman; import net.minecraft.server.v1_6_R2.EntityHuman;
import net.minecraft.server.v1_6_R2.IInventory; import net.minecraft.server.v1_6_R2.IInventory;
import net.minecraft.server.v1_6_R2.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_6_R2;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.EntityPlayer;
import net.minecraft.server.v1_6_R3.MinecraftServer; import net.minecraft.server.v1_6_R3.MinecraftServer;
@@ -29,10 +27,10 @@ import net.minecraft.server.v1_6_R3.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R3.CraftServer; import org.bukkit.craftbukkit.v1_6_R3.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_6_R3;
import net.minecraft.server.v1_6_R3.ContainerChest; import net.minecraft.server.v1_6_R3.ContainerChest;
import net.minecraft.server.v1_6_R3.EntityHuman; import net.minecraft.server.v1_6_R3.EntityHuman;
import net.minecraft.server.v1_6_R3.IInventory; import net.minecraft.server.v1_6_R3.IInventory;
import net.minecraft.server.v1_6_R3.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried());
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_6_R3;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_7_R1.EntityPlayer; import net.minecraft.server.v1_7_R1.EntityPlayer;
import net.minecraft.server.v1_7_R1.MinecraftServer; import net.minecraft.server.v1_7_R1.MinecraftServer;
@@ -30,10 +28,10 @@ import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R1.CraftServer; import org.bukkit.craftbukkit.v1_7_R1.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(null, offline.getName()); GameProfile profile = new GameProfile(null, offline.getName());

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_7_R1;
import net.minecraft.server.v1_7_R1.ContainerChest; import net.minecraft.server.v1_7_R1.ContainerChest;
import net.minecraft.server.v1_7_R1.EntityHuman; import net.minecraft.server.v1_7_R1.EntityHuman;
import net.minecraft.server.v1_7_R1.IInventory; import net.minecraft.server.v1_7_R1.IInventory;
import net.minecraft.server.v1_7_R1.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_7_R1;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile //Volatile
import net.minecraft.server.v1_7_R2.EntityPlayer; import net.minecraft.server.v1_7_R2.EntityPlayer;
import net.minecraft.server.v1_7_R2.MinecraftServer; import net.minecraft.server.v1_7_R2.MinecraftServer;
@@ -30,10 +28,10 @@ import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R2.CraftServer; import org.bukkit.craftbukkit.v1_7_R2.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(null, offline.getName()); GameProfile profile = new GameProfile(null, offline.getName());

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_7_R2;
import net.minecraft.server.v1_7_R2.ContainerChest; import net.minecraft.server.v1_7_R2.ContainerChest;
import net.minecraft.server.v1_7_R2.EntityHuman; import net.minecraft.server.v1_7_R2.EntityHuman;
import net.minecraft.server.v1_7_R2.IInventory; import net.minecraft.server.v1_7_R2.IInventory;
import net.minecraft.server.v1_7_R2.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_7_R2;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_7_R3.EntityPlayer; import net.minecraft.server.v1_7_R3.EntityPlayer;
import net.minecraft.server.v1_7_R3.MinecraftServer; import net.minecraft.server.v1_7_R3.MinecraftServer;
@@ -30,10 +28,10 @@ import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R3.CraftServer; import org.bukkit.craftbukkit.v1_7_R3.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName()); GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_7_R3;
import net.minecraft.server.v1_7_R3.ContainerChest; import net.minecraft.server.v1_7_R3.ContainerChest;
import net.minecraft.server.v1_7_R3.EntityHuman; import net.minecraft.server.v1_7_R3.EntityHuman;
import net.minecraft.server.v1_7_R3.IInventory; import net.minecraft.server.v1_7_R3.IInventory;
import net.minecraft.server.v1_7_R3.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_7_R3;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,8 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile // Volatile
import net.minecraft.server.v1_7_R4.EntityPlayer; import net.minecraft.server.v1_7_R4.EntityPlayer;
import net.minecraft.server.v1_7_R4.MinecraftServer; import net.minecraft.server.v1_7_R4.MinecraftServer;
@@ -30,10 +28,10 @@ import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R4.CraftServer; import org.bukkit.craftbukkit.v1_7_R4.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName()); GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_7_R4;
import net.minecraft.server.v1_7_R4.ContainerChest; import net.minecraft.server.v1_7_R4.ContainerChest;
import net.minecraft.server.v1_7_R4.EntityHuman; import net.minecraft.server.v1_7_R4.EntityHuman;
import net.minecraft.server.v1_7_R4.IInventory; import net.minecraft.server.v1_7_R4.IInventory;
import net.minecraft.server.v1_7_R4.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
//Volatile //Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_7_R4;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_8_R1.EntityPlayer; import net.minecraft.server.v1_8_R1.EntityPlayer;
@@ -30,10 +29,10 @@ import net.minecraft.server.v1_8_R1.PlayerInteractManager;
//Volatile //Volatile
import org.bukkit.craftbukkit.v1_8_R1.CraftServer; import org.bukkit.craftbukkit.v1_8_R1.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName()); GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data // Create an entity to load the player data

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_8_R1;
import net.minecraft.server.v1_8_R1.ContainerChest; import net.minecraft.server.v1_8_R1.ContainerChest;
import net.minecraft.server.v1_8_R1.EntityHuman; import net.minecraft.server.v1_8_R1.EntityHuman;
import net.minecraft.server.v1_8_R1.IInventory; import net.minecraft.server.v1_8_R1.IInventory;
import net.minecraft.server.v1_8_R1.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import net.minecraft.server.v1_8_R1.EntityHuman; import net.minecraft.server.v1_8_R1.EntityHuman;
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_8_R1;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import net.minecraft.server.v1_8_R1.EntityHuman; import net.minecraft.server.v1_8_R1.EntityHuman;
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
// Volatile // Volatile
@@ -30,10 +29,10 @@ import net.minecraft.server.v1_8_R2.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_8_R2.CraftServer; import org.bukkit.craftbukkit.v1_8_R2.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName()); GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_8_R2;
import net.minecraft.server.v1_8_R2.ContainerChest; import net.minecraft.server.v1_8_R2.ContainerChest;
import net.minecraft.server.v1_8_R2.EntityHuman; import net.minecraft.server.v1_8_R2.EntityHuman;
import net.minecraft.server.v1_8_R2.IInventory; import net.minecraft.server.v1_8_R2.IInventory;
import net.minecraft.server.v1_8_R2.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_8_R2;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.EntityPlayer;
@@ -30,10 +29,10 @@ import net.minecraft.server.v1_8_R3.PlayerInteractManager;
//Volatile //Volatile
import org.bukkit.craftbukkit.v1_8_R3.CraftServer; import org.bukkit.craftbukkit.v1_8_R3.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName()); GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_8_R3;
import net.minecraft.server.v1_8_R3.ContainerChest; import net.minecraft.server.v1_8_R3.ContainerChest;
import net.minecraft.server.v1_8_R3.EntityHuman; import net.minecraft.server.v1_8_R3.EntityHuman;
import net.minecraft.server.v1_8_R3.IInventory; import net.minecraft.server.v1_8_R3.IInventory;
import net.minecraft.server.v1_8_R3.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -19,6 +19,7 @@ package com.lishid.openinv.internal.v1_8_R3;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
//Volatile //Volatile
@@ -31,13 +32,16 @@ import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[5]; private final ItemStack[] extra = new ItemStack[5];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
@@ -50,18 +54,21 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; this.player = owner.getHandle();
p.getHandle().inventory.armor = this.armor; this.player.inventory.items = this.items;
p.saveData(); this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;
} }
} }
@@ -69,13 +76,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
// Volatile // Volatile
@@ -30,10 +29,10 @@ import net.minecraft.server.v1_9_R1.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_9_R1.CraftServer; import org.bukkit.craftbukkit.v1_9_R1.CraftServer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override @Override
public Player loadPlayer(OfflinePlayer offline) { public Player loadOfflinePlayer(OfflinePlayer offline) {
if (offline == null || !offline.hasPlayedBefore()) { if (offline == null || !offline.hasPlayedBefore()) {
return null; return null;
} }

View File

@@ -20,6 +20,7 @@ package com.lishid.openinv.internal.v1_9_R1;
import net.minecraft.server.v1_9_R1.ContainerChest; import net.minecraft.server.v1_9_R1.ContainerChest;
import net.minecraft.server.v1_9_R1.EntityHuman; import net.minecraft.server.v1_9_R1.EntityHuman;
import net.minecraft.server.v1_9_R1.IInventory; import net.minecraft.server.v1_9_R1.IInventory;
import net.minecraft.server.v1_9_R1.PlayerInventory;
public class SilentContainerChest extends ContainerChest { public class SilentContainerChest extends ContainerChest {
public IInventory inv; public IInventory inv;
@@ -32,7 +33,13 @@ public class SilentContainerChest extends ContainerChest {
} }
@Override @Override
public void b(EntityHuman paramEntityHuman) { public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up // Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
} }
} }

View File

@@ -25,6 +25,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile // Volatile
@@ -39,15 +40,18 @@ import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false; public boolean playerOnline = false;
private final CraftPlayer owner; private CraftPlayer owner;
private final InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
private final CraftInventory inventory = new CraftInventory(this);
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p; CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = player.getHandle().getEnderChest();
this.owner = player; this.owner = player;
@@ -60,22 +64,25 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player p) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest(); owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);
} }
catch (Exception e) {} catch (Exception e) {}
p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@@ -83,7 +90,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return inventoryRemovalCheck(); return inventoryRemovalCheck(false);
} }
@Override @Override
@@ -99,7 +106,7 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
transaction.remove(who); transaction.remove(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -22,6 +22,7 @@ import java.lang.reflect.Modifier;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile // Volatile
@@ -34,13 +35,16 @@ import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public boolean playerOnline = false; private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[4]; private final ItemStack[] extra = new ItemStack[4];
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle()); super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p); this.owner = ((CraftPlayer) p);
this.playerOnline = online; this.playerOnline = online;
setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots); setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots);
@@ -49,17 +53,30 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private void setItemArrays(PlayerInventory inventory, ItemStack[] items, ItemStack[] armor, private void setItemArrays(PlayerInventory inventory, ItemStack[] items, ItemStack[] armor,
ItemStack[] extraSlots) { ItemStack[] extraSlots) {
try { try {
Field field = inventory.getClass().getField("items"); // Prepare to remove final modifier
Field modifiers = Field.class.getDeclaredField("modifiers"); Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true); modifiers.setAccessible(true);
// Access and replace main inventory array
Field field = PlayerInventory.class.getField("items");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL); modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, items); field.set(inventory, items);
field = inventory.getClass().getField("armor");
// Access and replace armor inventory array
field = PlayerInventory.class.getField("armor");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL); modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, armor); field.set(inventory, armor);
field = inventory.getClass().getField("extraSlots");
// Access and replace offhand inventory array
field = PlayerInventory.class.getField("extraSlots");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL); modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, extraSlots); field.set(inventory, extraSlots);
// Access and replace array containing all inventory arrays
field = PlayerInventory.class.getDeclaredField("g");
field.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, new ItemStack[][] { items, armor, extraSlots });
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
// Unable to set final fields to item arrays, we're screwed. Noisily fail. // Unable to set final fields to item arrays, we're screwed. Noisily fail.
e.printStackTrace(); e.printStackTrace();
@@ -76,17 +93,20 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public boolean inventoryRemovalCheck() { public boolean inventoryRemovalCheck(boolean save) {
owner.saveData(); boolean offline = transaction.isEmpty() && !playerOnline;
return transaction.isEmpty() && !playerOnline; if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
} }
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; owner = (CraftPlayer) player;
setItemArrays(p.getHandle().inventory, items, armor, extraSlots); this.player = owner.getHandle();
p.saveData(); setItemArrays(this.player.inventory, items, armor, extraSlots);
playerOnline = true; playerOnline = true;
} }
} }
@@ -94,13 +114,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public boolean setPlayerOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
return this.inventoryRemovalCheck(); return this.inventoryRemovalCheck(false);
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.inventoryRemovalCheck(); this.inventoryRemovalCheck(true);
} }
@Override @Override

View File

@@ -0,0 +1,144 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_9_R2;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IAnySilentChest;
// Volatile
import net.minecraft.server.v1_9_R2.AxisAlignedBB;
import net.minecraft.server.v1_9_R2.Block;
import net.minecraft.server.v1_9_R2.BlockPosition;
import net.minecraft.server.v1_9_R2.Entity;
import net.minecraft.server.v1_9_R2.EntityOcelot;
import net.minecraft.server.v1_9_R2.EntityPlayer;
import net.minecraft.server.v1_9_R2.IInventory;
import net.minecraft.server.v1_9_R2.ITileInventory;
import net.minecraft.server.v1_9_R2.InventoryLargeChest;
import net.minecraft.server.v1_9_R2.PacketPlayOutOpenWindow;
import net.minecraft.server.v1_9_R2.TileEntityChest;
import net.minecraft.server.v1_9_R2.World;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
public class AnySilentChest implements IAnySilentChest {
@Override
public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
// If block or ocelot on top
if (world.getType(new BlockPosition(x, y + 1, z)).l() || hasOcelotOnTop(world, x, y, z))
return true;
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
// If block next to chest is chest and has a block or ocelot on top
if (isBlockedChest(world, id, x - 1, y, z))
return true;
if (isBlockedChest(world, id, x + 1, y, z))
return true;
if (isBlockedChest(world, id, x, y, z - 1))
return true;
if (isBlockedChest(world, id, x, y, z + 1))
return true;
return false;
}
private boolean isBlockedChest(World world, int id, int x, int y, int z) {
BlockPosition position = new BlockPosition(x, y, z);
if (Block.getId(world.getType(position).getBlock()) != id) {
return false;
}
if (world.getType(position).l()) {
return true;
}
return hasOcelotOnTop(world, x, y, z);
}
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
for (Entity localEntity : world.a(EntityOcelot.class,
new AxisAlignedBB(x, y + 1, z, x + 1, y + 2, z + 1))) {
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
if (localEntityOcelot.isSitting()) {
return true;
}
}
return false;
}
@Override
public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(new BlockPosition(x, y, z));
if (chest == null)
return true;
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
if (!anychest) {
if (world.getType(new BlockPosition(x, y + 1, z)).l())
return true;
if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).l()))
return true;
if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).l()))
return true;
if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).l()))
return true;
if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).l()))
return true;
}
if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
boolean returnValue = true;
if (!silentchest) {
player.openContainer((IInventory) chest);
}
else {
try {
SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
player.activeContainer = silentContainerChest;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = false;
}
catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
}
return returnValue;
}
}

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_9_R2;
import java.lang.reflect.Field;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess;
// Volatile
import net.minecraft.server.v1_9_R2.IInventory;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
@Override
public boolean check(Inventory inventory, HumanEntity player) {
IInventory inv = grabInventory(inventory);
if (inv instanceof SpecialPlayerInventory) {
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false;
}
}
else if (inv instanceof SpecialEnderChest) {
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
return false;
}
}
return true;
}
private IInventory grabInventory(Inventory inventory) {
if(inventory instanceof CraftInventory) {
return ((CraftInventory) inventory).getInventory();
}
//Use reflection to find the iinventory
Class<? extends Inventory> clazz = inventory.getClass();
IInventory result = null;
for(Field f : clazz.getDeclaredFields()) {
f.setAccessible(true);
if(IInventory.class.isAssignableFrom(f.getDeclaringClass())) {
try {
result = (IInventory) f.get(inventory);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_9_R2;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.mojang.authlib.GameProfile;
// Volatile
import net.minecraft.server.v1_9_R2.EntityPlayer;
import net.minecraft.server.v1_9_R2.MinecraftServer;
import net.minecraft.server.v1_9_R2.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_9_R2.CraftServer;
public class PlayerDataManager extends com.lishid.openinv.internal.PlayerDataManager {
@Override
public Player loadOfflinePlayer(OfflinePlayer offline) {
if (offline == null || !offline.hasPlayedBefore()) {
return null;
}
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.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)));
// Get the bukkit entity
Player target = (entity == null) ? null : entity.getBukkitEntity();
if (target != null) {
// Load data
target.loadData();
// Return the entity
return target;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getUniqueId().toString();
}
}

View File

@@ -0,0 +1,45 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_9_R2;
// Volatile
import net.minecraft.server.v1_9_R2.ContainerChest;
import net.minecraft.server.v1_9_R2.EntityHuman;
import net.minecraft.server.v1_9_R2.IInventory;
import net.minecraft.server.v1_9_R2.PlayerInventory;
public class SilentContainerChest extends ContainerChest {
public IInventory inv;
public SilentContainerChest(IInventory i1, IInventory i2, EntityHuman e1) {
super(i1, i2, e1);
inv = i2;
// close signal
inv.closeContainer(e1);
}
@Override
public void b(EntityHuman entityHuman) {
// Don't send close signal twice, might screw up
PlayerInventory playerinventory = entityHuman.inventory;
if (playerinventory.getCarried() != null) {
entityHuman.drop(playerinventory.getCarried(), false);
playerinventory.setCarried(null);
}
}
}

View File

@@ -0,0 +1,149 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_9_R2;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialEnderChest;
// Volatile
import net.minecraft.server.v1_9_R2.EntityHuman;
import net.minecraft.server.v1_9_R2.IInventory;
import net.minecraft.server.v1_9_R2.InventoryEnderChest;
import net.minecraft.server.v1_9_R2.InventorySubcontainer;
import net.minecraft.server.v1_9_R2.ItemStack;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftHumanEntity;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private final OpenInv plugin;
private final InventoryEnderChest enderChest;
private final CraftInventory inventory = new CraftInventory(this);
public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
private CraftPlayer owner;
private int maxStack = MAX_STACK;
public SpecialEnderChest(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
this.plugin = plugin;
CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest();
this.owner = player;
this.items = enderChest.getContents();
}
@Override
public Inventory getBukkitInventory() {
return inventory;
}
@Override
public boolean inventoryRemovalCheck(boolean save) {
boolean offline = transaction.isEmpty() && !playerOnline;
if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
}
@Override
public void setPlayerOnline(Player player) {
if (!playerOnline) {
try {
owner = (CraftPlayer) player;
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true);
field.set(playerEnderChest, this.items);
}
catch (Exception e) {}
playerOnline = true;
}
}
@Override
public boolean setPlayerOffline() {
playerOnline = false;
return inventoryRemovalCheck(false);
}
@Override
public ItemStack[] getContents() {
return this.items;
}
@Override
public void onOpen(CraftHumanEntity who) {
transaction.add(who);
}
@Override
public void onClose(CraftHumanEntity who) {
transaction.remove(who);
this.inventoryRemovalCheck(true);
}
@Override
public List<HumanEntity> getViewers() {
return transaction;
}
@Override
public InventoryHolder getOwner() {
return this.owner;
}
@Override
public void setMaxStackSize(int size) {
maxStack = size;
}
@Override
public int getMaxStackSize() {
return maxStack;
}
@Override
public boolean a(EntityHuman entityhuman) {
return true;
}
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -0,0 +1,321 @@
/*
* Copyright (C) 2011-2014 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_9_R2;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
import net.minecraft.server.v1_9_R2.EntityHuman;
import net.minecraft.server.v1_9_R2.ItemStack;
import net.minecraft.server.v1_9_R2.PlayerInventory;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftHumanEntity;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private final OpenInv plugin;
private final ItemStack[] extra = new ItemStack[4];
private final CraftInventory inventory = new CraftInventory(this);
private CraftPlayer owner;
private boolean playerOnline = false;
public SpecialPlayerInventory(OpenInv plugin, Player p, Boolean online) {
super(((CraftPlayer) p).getHandle());
this.plugin = plugin;
this.owner = ((CraftPlayer) p);
this.playerOnline = online;
setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots);
}
private void setItemArrays(PlayerInventory inventory, ItemStack[] items, ItemStack[] armor,
ItemStack[] extraSlots) {
try {
// Prepare to remove final modifier
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
// Access and replace main inventory array
Field field = PlayerInventory.class.getField("items");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, items);
// Access and replace armor inventory array
field = PlayerInventory.class.getField("armor");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, armor);
// Access and replace offhand inventory array
field = PlayerInventory.class.getField("extraSlots");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, extraSlots);
// Access and replace array containing all inventory arrays
field = PlayerInventory.class.getDeclaredField("g");
field.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(inventory, new ItemStack[][] { items, armor, extraSlots });
} catch (NoSuchFieldException e) {
// Unable to set final fields to item arrays, we're screwed. Noisily fail.
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public Inventory getBukkitInventory() {
return inventory;
}
@Override
public boolean inventoryRemovalCheck(boolean save) {
boolean offline = transaction.isEmpty() && !playerOnline;
if (offline && save && !plugin.disableSaving()) {
owner.saveData();
}
return offline;
}
@Override
public void setPlayerOnline(Player player) {
if (!playerOnline) {
owner = (CraftPlayer) player;
this.player = owner.getHandle();
setItemArrays(this.player.inventory, items, armor, extraSlots);
playerOnline = true;
}
}
@Override
public boolean setPlayerOffline() {
playerOnline = false;
return this.inventoryRemovalCheck(false);
}
@Override
public void onClose(CraftHumanEntity who) {
super.onClose(who);
this.inventoryRemovalCheck(true);
}
@Override
public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(armor, 0, C, items.length, armor.length);
System.arraycopy(extraSlots, 0, C, items.length + armor.length, extraSlots.length);
return C;
}
@Override
public int getSize() {
return super.getSize() + 5;
}
@Override
public ItemStack getItem(int i) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
// extraSlots is, for now, just an array with length 1. No need for special handling.
return is[i];
}
@Override
public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
if (is[i] != null) {
ItemStack itemstack;
if (is[i].count <= j) {
itemstack = is[i];
is[i] = null;
return itemstack;
}
else {
itemstack = is[i].cloneAndSubtract(j);
if (is[i].count == 0) {
is[i] = null;
}
return itemstack;
}
}
else {
return null;
}
}
@Override
public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
if (is[i] != null) {
ItemStack itemstack = is[i];
is[i] = null;
return itemstack;
}
else {
return null;
}
}
@Override
public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length;
is = this.armor;
}
else {
i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extraSlots;
}
else if (is == this.armor) {
i = getReversedArmorSlotNum(i);
}
if (i >= is.length) {
i -= is.length;
is = this.extra;
}
// Effects
if (is == this.extra) {
owner.getHandle().drop(itemstack, true);
itemstack = null;
}
is[i] = itemstack;
owner.getHandle().defaultContainer.b();
}
private int getReversedItemSlotNum(int i) {
if (i >= 27)
return i - 27;
else
return i + 9;
}
private int getReversedArmorSlotNum(int i) {
if (i == 0)
return 3;
if (i == 1)
return 2;
if (i == 2)
return 1;
if (i == 3)
return 0;
else
return i;
}
@Override
public String getName() {
if (player.getName().length() > 16) {
return player.getName().substring(0, 16);
}
return player.getName();
}
@Override
public boolean a(EntityHuman entityhuman) {
return true;
}
}

View File

@@ -1,6 +1,6 @@
name: OpenInv name: OpenInv
main: com.lishid.openinv.OpenInv main: com.lishid.openinv.OpenInv
version: 2.3.0 version: 2.4.9
author: lishid author: lishid
authors: [Jikoo] authors: [Jikoo]
description: > description: >