@@ -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);
|
||||
}
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user