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

View File

@@ -49,17 +49,30 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private void setItemArrays(PlayerInventory inventory, ItemStack[] items, ItemStack[] armor,
ItemStack[] extraSlots) {
try {
Field field = inventory.getClass().getField("items");
// 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);
field = inventory.getClass().getField("armor");
// Access and replace armor inventory array
field = PlayerInventory.class.getField("armor");
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
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);
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();
@@ -84,9 +97,10 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override
public void setPlayerOnline(Player player) {
if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player;
setItemArrays(p.getHandle().inventory, items, armor, extraSlots);
p.saveData();
owner = (CraftPlayer) player;
this.player = owner.getHandle();
setItemArrays(this.player.inventory, items, armor, extraSlots);
owner.saveData();
playerOnline = true;
}
}