@@ -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);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,20 +40,26 @@ 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) {
 | 
				
			||||||
 | 
					        new BukkitRunnable() {
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public void run() {
 | 
				
			||||||
 | 
					                if (!event.getPlayer().isOnline()) {
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                ISpecialPlayerInventory inventory = plugin.getInventoryFor(event.getPlayer());
 | 
					                ISpecialPlayerInventory inventory = plugin.getInventoryFor(event.getPlayer());
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (inventory != null) {
 | 
					                if (inventory != null) {
 | 
				
			||||||
                    inventory.setPlayerOnline(event.getPlayer());
 | 
					                    inventory.setPlayerOnline(event.getPlayer());
 | 
				
			||||||
 | 
					                    event.getPlayer().updateInventory();
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                ISpecialEnderChest chest = plugin.getEnderChestFor(event.getPlayer());
 | 
					                ISpecialEnderChest chest = plugin.getEnderChestFor(event.getPlayer());
 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (chest != null) {
 | 
					                if (chest != null) {
 | 
				
			||||||
                    chest.setPlayerOnline(event.getPlayer());
 | 
					                    chest.setPlayerOnline(event.getPlayer());
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }.runTask(plugin);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @EventHandler(priority = EventPriority.MONITOR)
 | 
					    @EventHandler(priority = EventPriority.MONITOR)
 | 
				
			||||||
    public void onPlayerQuit(PlayerQuitEvent event) {
 | 
					    public void onPlayerQuit(PlayerQuitEvent event) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user