Properly update PlayerInventory owner when they come online

Closes #5
This commit is contained in:
Jikoo
2016-04-11 17:59:28 -04:00
parent e39ab10797
commit 0ebe6fe132
3 changed files with 40 additions and 28 deletions

View File

@@ -165,15 +165,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);
} }

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

@@ -49,17 +49,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();
@@ -84,9 +97,10 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@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);
owner.saveData();
playerOnline = true; playerOnline = true;
} }
} }