Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a66b2e81b |
10
.gitignore
vendored
10
.gitignore
vendored
@@ -1,10 +0,0 @@
|
|||||||
**/.settings
|
|
||||||
**/.gitignore
|
|
||||||
**/.project
|
|
||||||
**/.classpath
|
|
||||||
**/.idea
|
|
||||||
**/target
|
|
||||||
**/bin
|
|
||||||
**/lib
|
|
||||||
**/out
|
|
||||||
**dependency-reduced-pom.xml
|
|
||||||
3
.settings/org.eclipse.ltk.core.refactoring.prefs
Normal file
3
.settings/org.eclipse.ltk.core.refactoring.prefs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#Wed Jun 01 17:38:54 EDT 2011
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_4_5</artifactId>
|
|
||||||
<name>OpenInvAdapter1_4_5</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>craftbukkit</artifactId>
|
|
||||||
<version>1.4.5-R1.0</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,168 +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.v1_4_5;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_5.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_4_5.BlockEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_5.EntityOcelot;
|
|
||||||
import net.minecraft.server.v1_4_5.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_4_5.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_5.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_5.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_4_5.Packet100OpenWindow;
|
|
||||||
import net.minecraft.server.v1_4_5.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_4_5.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_5.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
return block.getType() == Material.ENDER_CHEST || block.getState() instanceof org.bukkit.block.Chest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
|
|
||||||
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.t(block.getX(), block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If block or ocelot on top
|
|
||||||
if (isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
// If block next to chest is chest and has a block or ocelot on top
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() + 1);
|
|
||||||
} else if(world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() - 1);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() + 1, block.getY() + 1, block.getZ());
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() - 1, block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, int x, int y, int z) {
|
|
||||||
return world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
|
|
||||||
for (Object localEntity : world.a(EntityOcelot.class,
|
|
||||||
AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is API-only
|
|
||||||
if (silentchest && block.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
World world = player.world;
|
|
||||||
Object tile = world.getTileEntity(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
|
|
||||||
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
if (!silentchest) {
|
|
||||||
player.openContainer((IInventory) tile);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int windowId = 0;
|
|
||||||
try {
|
|
||||||
Field windowID = player.getClass().getDeclaredField("containerCounter");
|
|
||||||
windowID.setAccessible(true);
|
|
||||||
windowId = windowID.getInt(player);
|
|
||||||
windowId = windowId % 100 + 1;
|
|
||||||
windowID.setInt(player, windowId);
|
|
||||||
} catch (NoSuchFieldException e) {}
|
|
||||||
|
|
||||||
player.netServerHandler.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize()));
|
|
||||||
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_4_5;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_5.IInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class InventoryAccess implements IInventoryAccess {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,62 +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.v1_4_5;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_5.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_4_5.ItemInWorldManager;
|
|
||||||
import net.minecraft.server.v1_4_5.MinecraftServer;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_5.CraftServer;
|
|
||||||
|
|
||||||
public class PlayerDataManager implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure the player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
|
|
||||||
// Create an entity to load the player data
|
|
||||||
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), offline.getName(),
|
|
||||||
new ItemInWorldManager(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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,46 +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.v1_4_5;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_5.ContainerChest;
|
|
||||||
import net.minecraft.server.v1_4_5.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_4_5.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_5.ItemStack;
|
|
||||||
import net.minecraft.server.v1_4_5.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest {
|
|
||||||
|
|
||||||
public SilentContainerChest(IInventory i1, IInventory i2) {
|
|
||||||
super(i1, i2);
|
|
||||||
// Send close signal
|
|
||||||
i2.f();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void b(EntityHuman entityHuman) {
|
|
||||||
// Don't send close signal twice, might screw up
|
|
||||||
PlayerInventory playerinventory = entityHuman.inventory;
|
|
||||||
|
|
||||||
if (playerinventory.getCarried() != null) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(null);
|
|
||||||
entityHuman.drop(carried);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,128 +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.v1_4_5;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_5.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_5.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_5.InventorySubcontainer;
|
|
||||||
import net.minecraft.server.v1_4_5.ItemStack;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_5.entity.CraftHumanEntity;
|
|
||||||
import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
|
|
||||||
|
|
||||||
private final InventoryEnderChest enderChest;
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private final List<HumanEntity> transaction = new ArrayList<HumanEntity>();
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
private CraftPlayer owner;
|
|
||||||
private int maxStack = MAX_STACK;
|
|
||||||
|
|
||||||
public SpecialEnderChest(Player p, Boolean online) {
|
|
||||||
super(((CraftPlayer) p).getHandle().getEnderChest().getName(),
|
|
||||||
((CraftPlayer) p).getHandle().getEnderChest().getSize());
|
|
||||||
CraftPlayer player = (CraftPlayer) p;
|
|
||||||
this.enderChest = player.getHandle().getEnderChest();
|
|
||||||
this.owner = player;
|
|
||||||
this.items = enderChest.getContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void update() {
|
|
||||||
super.update();
|
|
||||||
enderChest.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_4_6</artifactId>
|
|
||||||
<name>OpenInvAdapter1_4_6</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>craftbukkit</artifactId>
|
|
||||||
<version>1.4.6-R0.3</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,168 +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.v1_4_6;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_6.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_4_6.BlockEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_6.EntityOcelot;
|
|
||||||
import net.minecraft.server.v1_4_6.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_4_6.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_6.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_6.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_4_6.Packet100OpenWindow;
|
|
||||||
import net.minecraft.server.v1_4_6.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_4_6.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_6.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
return block.getType() == Material.ENDER_CHEST || block.getState() instanceof org.bukkit.block.Chest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
|
|
||||||
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.t(block.getX(), block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If block or ocelot on top
|
|
||||||
if (isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
// If block next to chest is chest and has a block or ocelot on top
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() + 1);
|
|
||||||
} else if(world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() - 1);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() + 1, block.getY() + 1, block.getZ());
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() - 1, block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, int x, int y, int z) {
|
|
||||||
return world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
|
|
||||||
for (Object localEntity : world.a(EntityOcelot.class,
|
|
||||||
AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is API-only
|
|
||||||
if (silentchest && block.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
World world = player.world;
|
|
||||||
Object tile = world.getTileEntity(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
|
|
||||||
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
if (!silentchest) {
|
|
||||||
player.openContainer((IInventory) tile);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int windowId = 0;
|
|
||||||
try {
|
|
||||||
Field windowID = player.getClass().getDeclaredField("containerCounter");
|
|
||||||
windowID.setAccessible(true);
|
|
||||||
windowId = windowID.getInt(player);
|
|
||||||
windowId = windowId % 100 + 1;
|
|
||||||
windowID.setInt(player, windowId);
|
|
||||||
} catch (NoSuchFieldException e) {}
|
|
||||||
|
|
||||||
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize()));
|
|
||||||
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_4_6;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_6.IInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class InventoryAccess implements IInventoryAccess {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,62 +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.v1_4_6;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_6.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_4_6.MinecraftServer;
|
|
||||||
import net.minecraft.server.v1_4_6.PlayerInteractManager;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_6.CraftServer;
|
|
||||||
|
|
||||||
public class PlayerDataManager implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure the player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
|
|
||||||
// Create an entity to load the player data
|
|
||||||
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), offline.getName(),
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,46 +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.v1_4_6;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_6.ContainerChest;
|
|
||||||
import net.minecraft.server.v1_4_6.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_4_6.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_6.ItemStack;
|
|
||||||
import net.minecraft.server.v1_4_6.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest {
|
|
||||||
|
|
||||||
public SilentContainerChest(IInventory i1, IInventory i2) {
|
|
||||||
super(i1, i2);
|
|
||||||
// Send close signal
|
|
||||||
i2.f();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void b(EntityHuman entityHuman) {
|
|
||||||
// Don't send close signal twice, might screw up
|
|
||||||
PlayerInventory playerinventory = entityHuman.inventory;
|
|
||||||
|
|
||||||
if (playerinventory.getCarried() != null) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(null);
|
|
||||||
entityHuman.drop(carried);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,229 +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.v1_4_6;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_6.ItemStack;
|
|
||||||
import net.minecraft.server.v1_4_6.PlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
|
||||||
|
|
||||||
private final ItemStack[] extra = new ItemStack[5];
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
|
|
||||||
super(((CraftPlayer) bukkitPlayer).getHandle());
|
|
||||||
this.playerOnline = online;
|
|
||||||
this.items = player.inventory.items;
|
|
||||||
this.armor = player.inventory.armor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
this.player = ((CraftPlayer) player).getHandle();
|
|
||||||
this.player.inventory.items = this.items;
|
|
||||||
this.player.inventory.armor = this.armor;
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack[] getContents() {
|
|
||||||
ItemStack[] contents = new ItemStack[getSize()];
|
|
||||||
System.arraycopy(items, 0, contents, 0, items.length);
|
|
||||||
System.arraycopy(armor, 0, contents, items.length, armor.length);
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is[i] != null) {
|
|
||||||
ItemStack itemstack;
|
|
||||||
|
|
||||||
if (is[i].count <= j) {
|
|
||||||
itemstack = is[i];
|
|
||||||
is[i] = null;
|
|
||||||
return itemstack;
|
|
||||||
} else {
|
|
||||||
itemstack = is[i].a(j);
|
|
||||||
if (is[i].count == 0) {
|
|
||||||
is[i] = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is[i] != null) {
|
|
||||||
ItemStack itemstack = is[i];
|
|
||||||
|
|
||||||
is[i] = null;
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Effects
|
|
||||||
if (is == this.extra) {
|
|
||||||
player.drop(itemstack);
|
|
||||||
itemstack = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
is[i] = itemstack;
|
|
||||||
|
|
||||||
player.defaultContainer.b();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getReversedItemSlotNum(int i) {
|
|
||||||
if (i >= 27) {
|
|
||||||
return i - 27;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
if (player.getName().length() > 16) {
|
|
||||||
return player.getName().substring(0, 16);
|
|
||||||
}
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
13
README
Normal file
13
README
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
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/>.
|
||||||
139
README.MD
139
README.MD
@@ -1,139 +0,0 @@
|
|||||||
## About
|
|
||||||
OpenInv is a [Bukkit plugin](https://dev.bukkit.org/bukkit-plugins/openinv/) which allows users to open and edit anyone's inventory or ender chest - online or not!
|
|
||||||
|
|
||||||
## Features
|
|
||||||
- **OpenInv**: Open anyone's inventory, even if they're offline.
|
|
||||||
- Read-only mode! No edits allowed! Don't grant the permission `OpenInv.editinv`
|
|
||||||
- Cross-world support! Don't grant `OpenInv.crossworld`
|
|
||||||
- No self-opening! Don't grant `OpenInv.openself`
|
|
||||||
- Drop items as the player! Place items in the unused slots to the right of the armor to drop them
|
|
||||||
- **OpenEnder**: Open anyone's inventory, even if they're offline.
|
|
||||||
- Read-only mode! No edits allowed! Don't grant `OpenInv.editender`
|
|
||||||
- Cross-world support! Don't grant `OpenInv.crossworld`
|
|
||||||
- No self-opening! Don't grant `OpenInv.openself`
|
|
||||||
- **SilentChest**: Open containers without displaying an animation or making sound.
|
|
||||||
- **AnyChest**: Open containers, even if blocked by ocelots or blocks.
|
|
||||||
|
|
||||||
## Commands
|
|
||||||
<table width=100%>
|
|
||||||
<tr>
|
|
||||||
<th width=175px>Command</th>
|
|
||||||
<th>Aliases</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>/openinv [player]</td>
|
|
||||||
<td>oi, inv, open</td>
|
|
||||||
<td>Open a player's inventory. If unspecified, will select last player opened or own if none opened previously.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>/openender [player]</td>
|
|
||||||
<td>oe</td>
|
|
||||||
<td>Open a player's ender chest. If unspecified, will select last player opened or own if none opened previously.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>/searchinv <item> [minAmount]</td>
|
|
||||||
<td>si</td>
|
|
||||||
<td>Lists all online players that have a certain item in their inventory.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>/searchender <item> [minAmount]</td>
|
|
||||||
<td>se</td>
|
|
||||||
<td>Lists all online players that have a certain item in their ender chest.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>/anychest [check]</td>
|
|
||||||
<td>ac</td>
|
|
||||||
<td>Check or toggle the AnyChest function, allowing opening blocked containers.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>/silentchest [check]</td>
|
|
||||||
<td>sc</td>
|
|
||||||
<td>Check or toggle the SilentChest function, allowing opening containers silently.</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## Permissions
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>Node</th>
|
|
||||||
<th>Description</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.*</td>
|
|
||||||
<td>Gives permission to use all of OpenInv.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.openinv</td>
|
|
||||||
<td>Required to use /openinv.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.openself</td>
|
|
||||||
<td>Required to open own inventory.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.editinv</td>
|
|
||||||
<td>Required to make changes to open inventories.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.openender</td>
|
|
||||||
<td>Required to use /openender.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.editinv</td>
|
|
||||||
<td>Required to make changes to open ender chests.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.openenderall</td>
|
|
||||||
<td>Allows users to open others' ender chests. Without it, users can only open their own.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.exempt</td>
|
|
||||||
<td>Prevents the player's inventory being opened by others.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.override</td>
|
|
||||||
<td>Allows bypassing of the exempt permission.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.crossworld</td>
|
|
||||||
<td>Allows cross-world usage of /openinv and /openender.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.search</td>
|
|
||||||
<td>Required to use /searchinv and /searchender.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.anychest</td>
|
|
||||||
<td>Required to use /anychest.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OpenInv.silent</td>
|
|
||||||
<td>Required to use /silentchest.</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## For Developers
|
|
||||||
To compile, the relevant Craftbukkit/Spigot jars must be installed in your local repository using the install plugin.
|
|
||||||
Ex: `mvn install:install-file -Dpackaging=jar -Dfile=spigot-1.11-R0.1-SNAPSHOT.jar -DgroupId=org.spigotmc -DartifactId=spigot -Dversion=1.11-R0.1-SNAPSHOT`
|
|
||||||
|
|
||||||
Compiling OpenInv for a specific version is very easy - just compile the correct module.
|
|
||||||
|
|
||||||
Compiling for a set of versions is slightly more complex. You'll need to use a profile for the versions you want to compile. Provided profiles are latest, modern (versions 1.8+), and all. For more information, check out the [official guide](http://maven.apache.org/guides/introduction/introduction-to-profiles.html).
|
|
||||||
|
|
||||||
## License
|
|
||||||
```
|
|
||||||
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/>.
|
|
||||||
```
|
|
||||||
208
assembly/pom.xml
208
assembly/pom.xml
@@ -1,208 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvassembly</artifactId>
|
|
||||||
<name>OpenInvAssembly</name>
|
|
||||||
|
|
||||||
<profiles>
|
|
||||||
|
|
||||||
<profile>
|
|
||||||
<id>latest</id>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_11_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
<profile>
|
|
||||||
<id>modern</id>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_8_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_8_R2</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_8_R3</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_9_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_9_R2</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_10_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_11_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
<profile>
|
|
||||||
<id>all</id>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_4_5</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_4_6</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_4_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_5_R2</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_5_R3</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_6_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_6_R2</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_6_R3</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_7_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_7_R2</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_7_R3</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_7_R4</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_8_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_8_R2</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_8_R3</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_9_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_9_R2</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_10_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvadapter1_11_R1</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
</profiles>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<directory>../target</directory>
|
|
||||||
<finalName>OpenInv</finalName>
|
|
||||||
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
|
||||||
<version>2.4.3</version>
|
|
||||||
<configuration>
|
|
||||||
<!--
|
|
||||||
~ This keeps the final file clean, but may cause issues for people not familiar with the setup.
|
|
||||||
~ If you're having trouble with the final product missing files, remove or tweak this configuration.
|
|
||||||
-->
|
|
||||||
<minimizeJar>true</minimizeJar>
|
|
||||||
<filters>
|
|
||||||
<filter>
|
|
||||||
<artifact>com.lishid:*</artifact>
|
|
||||||
<includes>
|
|
||||||
<include>com/lishid/openinv/**/*</include>
|
|
||||||
<include>plugin.yml</include>
|
|
||||||
</includes>
|
|
||||||
</filter>
|
|
||||||
</filters>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>shade</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvinternal</artifactId>
|
|
||||||
<name>OpenInvInternal</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>bukkit</artifactId>
|
|
||||||
<version>1.4.5-R1.0</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package com.lishid.openinv.internal;
|
|
||||||
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
public interface IAnySilentContainer {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the given block is a container which can be unblocked or silenced.
|
|
||||||
*
|
|
||||||
* @param block the BlockState
|
|
||||||
* @return true if the Block is a supported container
|
|
||||||
*/
|
|
||||||
public boolean isAnySilentContainer(Block block);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the container at the given coordinates is blocked.
|
|
||||||
*
|
|
||||||
* @param player the Player opening the container
|
|
||||||
* @param block the Block
|
|
||||||
* @return true if the container is blocked
|
|
||||||
*/
|
|
||||||
public boolean isAnyContainerNeeded(Player player, Block block);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the container at the given coordinates for the Player. If you do not want blocked
|
|
||||||
* containers to open, be sure to check {@link #isAnyContainerNeeded(Player, Block)}
|
|
||||||
* first.
|
|
||||||
*
|
|
||||||
* @param player
|
|
||||||
* @param silentchest whether the container's noise is to be silenced
|
|
||||||
* @param block the Block
|
|
||||||
* @return true if the container can be opened
|
|
||||||
*/
|
|
||||||
public boolean activateContainer(Player player, boolean silentchest, Block block);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,57 +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.inventory.Inventory;
|
|
||||||
|
|
||||||
public interface IInventoryAccess {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if an Inventory is an ISpecialPlayerInventory implementation.
|
|
||||||
*
|
|
||||||
* @param inventory the Inventory
|
|
||||||
* @return true if the Inventory is backed by an ISpecialPlayerInventory
|
|
||||||
*/
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an ISpecialPlayerInventory from an Inventory or null if the Inventory is not backed by
|
|
||||||
* an ISpecialPlayerInventory.
|
|
||||||
*
|
|
||||||
* @param inventory the Inventory
|
|
||||||
* @return the ISpecialPlayerInventory or null
|
|
||||||
*/
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if an Inventory is an ISpecialEnderChest implementation.
|
|
||||||
*
|
|
||||||
* @param inventory the Inventory
|
|
||||||
* @return true if the Inventory is backed by an ISpecialEnderChest
|
|
||||||
*/
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an ISpecialEnderChest from an Inventory or null if the Inventory is not backed by an
|
|
||||||
* ISpecialEnderChest.
|
|
||||||
*
|
|
||||||
* @param inventory the Inventory
|
|
||||||
* @return the ISpecialEnderChest or null
|
|
||||||
*/
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,180 +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 java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.plugin.Plugin;
|
|
||||||
|
|
||||||
public class InternalAccessor {
|
|
||||||
|
|
||||||
private final Plugin plugin;
|
|
||||||
|
|
||||||
private final String version;
|
|
||||||
private boolean supported = false;
|
|
||||||
|
|
||||||
public InternalAccessor(Plugin plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
|
|
||||||
String packageName = plugin.getServer().getClass().getPackage().getName();
|
|
||||||
version = packageName.substring(packageName.lastIndexOf('.') + 1);
|
|
||||||
|
|
||||||
try {
|
|
||||||
Class.forName("com.lishid.openinv.internal." + version + ".PlayerDataManager");
|
|
||||||
supported = true;
|
|
||||||
} catch (Exception e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the server implementation version. If not initialized, returns the string "null"
|
|
||||||
* instead.
|
|
||||||
*
|
|
||||||
* @return the version, or "null"
|
|
||||||
*/
|
|
||||||
public String getVersion() {
|
|
||||||
return this.version != null ? this.version : "null";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the server implementation is supported.
|
|
||||||
*
|
|
||||||
* @return true if initialized for a supported server version
|
|
||||||
*/
|
|
||||||
public boolean isSupported() {
|
|
||||||
return this.supported;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance of the IPlayerDataManager implementation for the current server version,
|
|
||||||
* or null if unsupported.
|
|
||||||
*
|
|
||||||
* @return the IPlayerDataManager
|
|
||||||
*/
|
|
||||||
public IPlayerDataManager newPlayerDataManager() {
|
|
||||||
return createObject(IPlayerDataManager.class, "PlayerDataManager");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance of the IInventoryAccess implementation for the current server version, or
|
|
||||||
* null if unsupported.
|
|
||||||
*
|
|
||||||
* @return the IInventoryAccess
|
|
||||||
*/
|
|
||||||
public IInventoryAccess newInventoryAccess() {
|
|
||||||
return createObject(IInventoryAccess.class, "InventoryAccess");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance of the IAnySilentContainer implementation for the current server version,
|
|
||||||
* or null if unsupported.
|
|
||||||
*
|
|
||||||
* @return the IAnySilentContainer
|
|
||||||
*/
|
|
||||||
public IAnySilentContainer newAnySilentContainer() {
|
|
||||||
return createObject(IAnySilentContainer.class, "AnySilentContainer");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance of the ISpecialPlayerInventory implementation for the given Player, or
|
|
||||||
* null if the current version is unsupported.
|
|
||||||
*
|
|
||||||
* @param player the Player
|
|
||||||
* @param online true if the Player is online
|
|
||||||
* @return the ISpecialPlayerInventory created
|
|
||||||
*/
|
|
||||||
public ISpecialPlayerInventory newSpecialPlayerInventory(Player player, boolean online) {
|
|
||||||
return createObject(ISpecialPlayerInventory.class, "SpecialPlayerInventory", player, online);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an instance of the ISpecialEnderChest implementation for the given Player, or
|
|
||||||
* null if the current version is unsupported.
|
|
||||||
*
|
|
||||||
* @param player the Player
|
|
||||||
* @param online true if the Player is online
|
|
||||||
* @return the ISpecialEnderChest created
|
|
||||||
*/
|
|
||||||
public ISpecialEnderChest newSpecialEnderChest(Player player, boolean online) {
|
|
||||||
return createObject(ISpecialEnderChest.class, "SpecialEnderChest", player, online);
|
|
||||||
}
|
|
||||||
|
|
||||||
private <T> T createObject(Class<? extends T> assignableClass, String className, Object... params) {
|
|
||||||
try {
|
|
||||||
// Check if internal versioned class exists
|
|
||||||
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + "." + className);
|
|
||||||
if (!assignableClass.isAssignableFrom(internalClass)) {
|
|
||||||
plugin.getLogger().warning("Found class " + internalClass.getName() + " but cannot cast to " + assignableClass.getName());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quick return: no parameters, no need to fiddle about finding the correct constructor.
|
|
||||||
if (params.length == 0) {
|
|
||||||
return assignableClass.cast(internalClass.getConstructor().newInstance());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search constructors for one matching the given parameters
|
|
||||||
nextConstructor: for (Constructor<?> constructor : internalClass.getConstructors()) {
|
|
||||||
Class<?>[] requiredClasses = constructor.getParameterTypes();
|
|
||||||
if (requiredClasses.length != params.length) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < params.length; ++i) {
|
|
||||||
if (!requiredClasses[i].isAssignableFrom(params[i].getClass())) {
|
|
||||||
continue nextConstructor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return assignableClass.cast(constructor.newInstance(params));
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder message = new StringBuilder("Found class ").append(internalClass.getName())
|
|
||||||
.append(" but cannot find any matching constructors for [");
|
|
||||||
for (Object object : params) {
|
|
||||||
message.append(object.getClass().getName()).append(", ");
|
|
||||||
}
|
|
||||||
if (params.length > 0) {
|
|
||||||
message.delete(message.length() - 2, message.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin.getLogger().warning(message.append(']').toString());
|
|
||||||
} catch (Exception e) {
|
|
||||||
plugin.getLogger().warning("OpenInv encountered an error with the CraftBukkit version \"" + version + "\". Please look for an updated version of OpenInv.");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> T grabFieldOfTypeFromObject(Class<T> type, Object object) {
|
|
||||||
// Use reflection to find the iinventory
|
|
||||||
Class<?> clazz = object.getClass();
|
|
||||||
T result = null;
|
|
||||||
for (Field f : clazz.getDeclaredFields()) {
|
|
||||||
f.setAccessible(true);
|
|
||||||
if (type.isAssignableFrom(f.getDeclaringClass())) {
|
|
||||||
try {
|
|
||||||
result = type.cast(f.get(object));
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<name>OpenInvPlugin</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>bukkit</artifactId>
|
|
||||||
<!-- Really should use 1.4.5-R1.0, but the InventoryDragEvent doesn't exist. TODO separate module? -->
|
|
||||||
<version>1.11-R0.1-SNAPSHOT</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvinternal</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<resources>
|
|
||||||
<resource>
|
|
||||||
<directory>src/main/resources</directory>
|
|
||||||
<filtering>true</filtering>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,590 +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;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
|
|
||||||
import com.lishid.openinv.commands.AnyChestPluginCommand;
|
|
||||||
import com.lishid.openinv.commands.OpenEnderPluginCommand;
|
|
||||||
import com.lishid.openinv.commands.OpenInvPluginCommand;
|
|
||||||
import com.lishid.openinv.commands.SearchInvPluginCommand;
|
|
||||||
import com.lishid.openinv.commands.SilentChestPluginCommand;
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
import com.lishid.openinv.util.Cache;
|
|
||||||
import com.lishid.openinv.util.Function;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.command.PluginCommand;
|
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.plugin.PluginManager;
|
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open other player's inventory
|
|
||||||
*
|
|
||||||
* @author lishid
|
|
||||||
*/
|
|
||||||
public class OpenInv extends JavaPlugin {
|
|
||||||
|
|
||||||
private final Map<String, ISpecialPlayerInventory> inventories = new HashMap<String, ISpecialPlayerInventory>();
|
|
||||||
private final Map<String, ISpecialEnderChest> enderChests = new HashMap<String, ISpecialEnderChest>();
|
|
||||||
private final Cache<String, Player> playerCache = new Cache<String, Player>(300000L,
|
|
||||||
new Function<Player>() {
|
|
||||||
@Override
|
|
||||||
public boolean run(Player value) {
|
|
||||||
String key = playerLoader.getPlayerDataID(value);
|
|
||||||
return inventories.containsKey(key) && inventories.get(key).isInUse()
|
|
||||||
|| enderChests.containsKey(key) && enderChests.get(key).isInUse();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Function<Player>() {
|
|
||||||
@Override
|
|
||||||
public boolean run(Player value) {
|
|
||||||
String key = playerLoader.getPlayerDataID(value);
|
|
||||||
|
|
||||||
// Check if inventory is stored, and if it is, remove it and eject all viewers
|
|
||||||
if (inventories.containsKey(key)) {
|
|
||||||
Inventory inv = inventories.remove(key).getBukkitInventory();
|
|
||||||
for (HumanEntity entity : inv.getViewers()) {
|
|
||||||
entity.closeInventory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if ender chest is stored, and if it is, remove it and eject all viewers
|
|
||||||
if (enderChests.containsKey(key)) {
|
|
||||||
Inventory inv = enderChests.remove(key).getBukkitInventory();
|
|
||||||
for (HumanEntity entity : inv.getViewers()) {
|
|
||||||
entity.closeInventory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!OpenInv.this.disableSaving() && !value.isOnline()) {
|
|
||||||
value.saveData();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
private InternalAccessor accessor;
|
|
||||||
private IPlayerDataManager playerLoader;
|
|
||||||
private IInventoryAccess inventoryAccess;
|
|
||||||
private IAnySilentContainer anySilentContainer;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onEnable() {
|
|
||||||
// Get plugin manager
|
|
||||||
PluginManager pm = getServer().getPluginManager();
|
|
||||||
|
|
||||||
accessor = new InternalAccessor(this);
|
|
||||||
// Version check
|
|
||||||
if (!accessor.isSupported()) {
|
|
||||||
getLogger().info("Your version of CraftBukkit (" + accessor.getVersion() + ") is not supported.");
|
|
||||||
getLogger().info("Please look for an updated version of OpenInv.");
|
|
||||||
pm.disablePlugin(this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
playerLoader = accessor.newPlayerDataManager();
|
|
||||||
inventoryAccess = accessor.newInventoryAccess();
|
|
||||||
anySilentContainer = accessor.newAnySilentContainer();
|
|
||||||
|
|
||||||
FileConfiguration config = getConfig();
|
|
||||||
boolean dirtyConfig = false;
|
|
||||||
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("NotifyAnyChest", true);
|
|
||||||
config.addDefault("DisableSaving", false);
|
|
||||||
config.options().copyDefaults(true);
|
|
||||||
if (dirtyConfig) {
|
|
||||||
saveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
pm.registerEvents(new OpenInvPlayerListener(this), this);
|
|
||||||
pm.registerEvents(new OpenInvInventoryListener(this), this);
|
|
||||||
|
|
||||||
getCommand("openinv").setExecutor(new OpenInvPluginCommand(this));
|
|
||||||
SearchInvPluginCommand searchInv = new SearchInvPluginCommand();
|
|
||||||
getCommand("searchinv").setExecutor(searchInv);
|
|
||||||
getCommand("searchender").setExecutor(searchInv);
|
|
||||||
getCommand("silentchest").setExecutor(new SilentChestPluginCommand(this));
|
|
||||||
getCommand("anychest").setExecutor(new AnyChestPluginCommand(this));
|
|
||||||
getCommand("openender").setExecutor(new OpenEnderPluginCommand(this));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDisable() {
|
|
||||||
|
|
||||||
if (this.disableSaving()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.playerCache.invalidateAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the server version is supported by OpenInv.
|
|
||||||
*
|
|
||||||
* @return true if the server version is supported
|
|
||||||
*/
|
|
||||||
public boolean isSupportedVersion() {
|
|
||||||
return accessor.isSupported();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the active IInventoryAccess implementation. May return null if the server version is
|
|
||||||
* unsupported.
|
|
||||||
*
|
|
||||||
* @return the IInventoryAccess
|
|
||||||
*/
|
|
||||||
public IInventoryAccess getInventoryAccess() {
|
|
||||||
return this.inventoryAccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the active ISilentContainer implementation. May return null if the server version is
|
|
||||||
* unsupported.
|
|
||||||
*
|
|
||||||
* @return the ISilentContainer
|
|
||||||
*/
|
|
||||||
public IAnySilentContainer getAnySilentContainer() {
|
|
||||||
return this.anySilentContainer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an ISpecialPlayerInventory for the given Player.
|
|
||||||
*
|
|
||||||
* @param player the Player
|
|
||||||
* @param online true if the Player is currently online
|
|
||||||
* @return the ISpecialPlayerInventory
|
|
||||||
*/
|
|
||||||
public ISpecialPlayerInventory getInventory(Player player, boolean online) {
|
|
||||||
String id = playerLoader.getPlayerDataID(player);
|
|
||||||
if (inventories.containsKey(id)) {
|
|
||||||
return inventories.get(id);
|
|
||||||
}
|
|
||||||
ISpecialPlayerInventory inv = accessor.newSpecialPlayerInventory(player, online);
|
|
||||||
inventories.put(id, inv);
|
|
||||||
playerCache.put(id, player);
|
|
||||||
return inv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an ISpecialEnderChest for the given Player.
|
|
||||||
*
|
|
||||||
* @param player the Player
|
|
||||||
* @param online true if the Player is currently online
|
|
||||||
* @return the ISpecialEnderChest
|
|
||||||
*/
|
|
||||||
public ISpecialEnderChest getEnderChest(Player player, boolean online) {
|
|
||||||
String id = playerLoader.getPlayerDataID(player);
|
|
||||||
if (enderChests.containsKey(id)) {
|
|
||||||
return enderChests.get(id);
|
|
||||||
}
|
|
||||||
ISpecialEnderChest inv = accessor.newSpecialEnderChest(player, online);
|
|
||||||
enderChests.put(id, inv);
|
|
||||||
playerCache.put(id, player);
|
|
||||||
return inv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forcibly unload a cached Player's data.
|
|
||||||
*
|
|
||||||
* @param player the OfflinePlayer to unload
|
|
||||||
*/
|
|
||||||
public void unload(OfflinePlayer player) {
|
|
||||||
this.playerCache.invalidate(this.playerLoader.getPlayerDataID(player));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the configuration value for whether or not OpenInv saves player data when unloading
|
|
||||||
* players. This is exclusively for users who do not allow editing of inventories, only viewing,
|
|
||||||
* and wish to prevent any possibility of bugs such as lishid#40. If true, OpenInv will not ever
|
|
||||||
* save any edits made to players.
|
|
||||||
*
|
|
||||||
* @return false unless configured otherwise
|
|
||||||
*/
|
|
||||||
public boolean disableSaving() {
|
|
||||||
return getConfig().getBoolean("DisableSaving", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the configuration value for whether or not OpenInv displays a notification to the user
|
|
||||||
* when a container is activated with SilentChest.
|
|
||||||
*
|
|
||||||
* @return true unless configured otherwise
|
|
||||||
*/
|
|
||||||
public boolean notifySilentChest() {
|
|
||||||
return getConfig().getBoolean("NotifySilentChest", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check the configuration value for whether or not OpenInv displays a notification to the user
|
|
||||||
* when a container is activated with AnyChest.
|
|
||||||
*
|
|
||||||
* @return true unless configured otherwise
|
|
||||||
*/
|
|
||||||
public boolean notifyAnyChest() {
|
|
||||||
return getConfig().getBoolean("NotifyAnyChest", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a player's SilentChest setting.
|
|
||||||
*
|
|
||||||
* @param player the OfflinePlayer
|
|
||||||
* @return true if SilentChest is enabled
|
|
||||||
*/
|
|
||||||
public boolean getPlayerSilentChestStatus(OfflinePlayer player) {
|
|
||||||
return getConfig().getBoolean("SilentChest." + playerLoader.getPlayerDataID(player) + ".toggle", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a player's SilentChest setting.
|
|
||||||
*
|
|
||||||
* @param player the OfflinePlayer
|
|
||||||
* @param status the status
|
|
||||||
*/
|
|
||||||
public void setPlayerSilentChestStatus(OfflinePlayer player, boolean status) {
|
|
||||||
getConfig().set("SilentChest." + playerLoader.getPlayerDataID(player) + ".toggle", status);
|
|
||||||
saveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the provided player's AnyChest setting.
|
|
||||||
*
|
|
||||||
* @param player the OfflinePlayer
|
|
||||||
* @return true if AnyChest is enabled
|
|
||||||
*/
|
|
||||||
public boolean getPlayerAnyChestStatus(OfflinePlayer player) {
|
|
||||||
return getConfig().getBoolean("AnyChest." + playerLoader.getPlayerDataID(player) + ".toggle", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets a player's AnyChest setting.
|
|
||||||
*
|
|
||||||
* @param player the OfflinePlayer
|
|
||||||
* @param status the status
|
|
||||||
*/
|
|
||||||
public void setPlayerAnyChestStatus(OfflinePlayer player, boolean status) {
|
|
||||||
getConfig().set("AnyChest." + playerLoader.getPlayerDataID(player) + ".toggle", status);
|
|
||||||
saveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an OfflinePlayer by name.
|
|
||||||
* <p>
|
|
||||||
* Note: This method is potentially very heavily blocking. It should not ever be called on the
|
|
||||||
* main thread, and if it is, a stack trace will be displayed alerting server owners to the
|
|
||||||
* call.
|
|
||||||
*
|
|
||||||
* @param name the name of the Player
|
|
||||||
* @return the OfflinePlayer with the closest matching name 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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure name is valid if server is in online mode to avoid unnecessary searching
|
|
||||||
if (getServer().getOnlineMode() && !name.matches("[a-zA-Z0-9_]{3,16}")) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load a Player from an OfflinePlayer. May return null under some circumstances.
|
|
||||||
*
|
|
||||||
* @param offline the OfflinePlayer to load a Player for
|
|
||||||
* @return the Player
|
|
||||||
*/
|
|
||||||
public Player loadPlayer(final OfflinePlayer offline) {
|
|
||||||
|
|
||||||
if (offline == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String key = this.playerLoader.getPlayerDataID(offline);
|
|
||||||
if (this.playerCache.containsKey(key)) {
|
|
||||||
return this.playerCache.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
Player loaded;
|
|
||||||
|
|
||||||
if (offline.isOnline()) {
|
|
||||||
loaded = offline.getPlayer();
|
|
||||||
this.playerCache.put(key, loaded);
|
|
||||||
return loaded;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Bukkit.isPrimaryThread()) {
|
|
||||||
return this.playerLoader.loadPlayer(offline);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Player> future = Bukkit.getScheduler().callSyncMethod(this,
|
|
||||||
new Callable<Player>() {
|
|
||||||
@Override
|
|
||||||
public Player call() throws Exception {
|
|
||||||
return playerLoader.loadPlayer(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 {
|
|
||||||
loaded = future.get();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (loaded != null) {
|
|
||||||
this.playerCache.put(key, loaded);
|
|
||||||
}
|
|
||||||
|
|
||||||
return loaded;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method for handling a Player coming online.
|
|
||||||
*
|
|
||||||
* @param player the Player
|
|
||||||
*/
|
|
||||||
public void setPlayerOnline(final Player player) {
|
|
||||||
|
|
||||||
String key = this.playerLoader.getPlayerDataID(player);
|
|
||||||
|
|
||||||
// Check if the player is cached. If not, neither of their inventories is open.
|
|
||||||
if (!this.playerCache.containsKey(key)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.playerCache.put(key, player);
|
|
||||||
|
|
||||||
if (this.inventories.containsKey(key)) {
|
|
||||||
this.inventories.get(key).setPlayerOnline(player);
|
|
||||||
new BukkitRunnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (player.isOnline()) {
|
|
||||||
player.updateInventory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.runTask(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.enderChests.containsKey(key)) {
|
|
||||||
this.enderChests.get(key).setPlayerOnline(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method for handling a Player going offline.
|
|
||||||
*
|
|
||||||
* @param player the Player
|
|
||||||
*/
|
|
||||||
public void setPlayerOffline(final Player player) {
|
|
||||||
|
|
||||||
String key = this.playerLoader.getPlayerDataID(player);
|
|
||||||
|
|
||||||
// Check if the player is cached. If not, neither of their inventories is open.
|
|
||||||
if (!this.playerCache.containsKey(key)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.inventories.containsKey(key)) {
|
|
||||||
this.inventories.get(key).setPlayerOffline();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.enderChests.containsKey(key)) {
|
|
||||||
this.enderChests.get(key).setPlayerOffline();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Evicts all viewers lacking cross-world permissions from a Player's inventory.
|
|
||||||
*
|
|
||||||
* @param player the Player
|
|
||||||
*/
|
|
||||||
public void changeWorld(final Player player) {
|
|
||||||
|
|
||||||
String key = this.playerLoader.getPlayerDataID(player);
|
|
||||||
|
|
||||||
// Check if the player is cached. If not, neither of their inventories is open.
|
|
||||||
if (!this.playerCache.containsKey(key)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.inventories.containsKey(key)) {
|
|
||||||
Iterator<HumanEntity> iterator = this.inventories.get(key).getBukkitInventory().getViewers().iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
HumanEntity human = iterator.next();
|
|
||||||
// If player has permission or is in the same world, allow continued access
|
|
||||||
// Just in case, also allow null worlds.
|
|
||||||
if (Permissions.CROSSWORLD.hasPermission(human) || human.getWorld() == null
|
|
||||||
|| human.getWorld().equals(player.getWorld())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
human.closeInventory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.enderChests.containsKey(key)) {
|
|
||||||
Iterator<HumanEntity> iterator = this.enderChests.get(key).getBukkitInventory().getViewers().iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
HumanEntity human = iterator.next();
|
|
||||||
if (Permissions.CROSSWORLD.hasPermission(human) || human.getWorld() == null
|
|
||||||
|| human.getWorld().equals(player.getWorld())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
human.closeInventory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays all applicable help for OpenInv commands.
|
|
||||||
*
|
|
||||||
* @param player the Player to help
|
|
||||||
*/
|
|
||||||
public void showHelp(Player player) {
|
|
||||||
// Get registered commands
|
|
||||||
for (String commandName : this.getDescription().getCommands().keySet()) {
|
|
||||||
PluginCommand command = this.getCommand(commandName);
|
|
||||||
|
|
||||||
// Ensure command is successfully registered and player can use it
|
|
||||||
if (command == null || !command.testPermissionSilent(player)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send usage
|
|
||||||
player.sendMessage(command.getUsage().replace("<command>", commandName));
|
|
||||||
|
|
||||||
List<String> aliases = command.getAliases();
|
|
||||||
if (aliases.isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assemble alias list
|
|
||||||
StringBuilder aliasBuilder = new StringBuilder(" (aliases: ");
|
|
||||||
for (String alias : aliases) {
|
|
||||||
aliasBuilder.append(alias).append(", ");
|
|
||||||
}
|
|
||||||
aliasBuilder.delete(aliasBuilder.length() - 2, aliasBuilder.length()).append(')');
|
|
||||||
|
|
||||||
// Send all aliases
|
|
||||||
player.sendMessage(aliasBuilder.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,62 +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;
|
|
||||||
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
|
||||||
import org.bukkit.event.inventory.InventoryDragEvent;
|
|
||||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
public class OpenInvInventoryListener implements Listener {
|
|
||||||
|
|
||||||
private final OpenInv plugin;
|
|
||||||
|
|
||||||
public OpenInvInventoryListener(OpenInv plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
|
||||||
public void onInventoryClick(InventoryClickEvent event) {
|
|
||||||
if (cancelInteract(event.getWhoClicked(), event.getInventory())) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
|
||||||
public void onInventoryDrag(InventoryDragEvent event) {
|
|
||||||
if (cancelInteract(event.getWhoClicked(), event.getInventory())) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean cancelInteract(HumanEntity entity, Inventory inventory) {
|
|
||||||
return plugin.getInventoryAccess().isSpecialPlayerInventory(inventory)
|
|
||||||
&& !Permissions.EDITINV.hasPermission(entity)
|
|
||||||
|| plugin.getInventoryAccess().isSpecialEnderChest(inventory)
|
|
||||||
&& !Permissions.EDITENDER.hasPermission(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onWorldChange(PlayerChangedWorldEvent event) {
|
|
||||||
plugin.changeWorld(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,78 +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;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.Event.Result;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.block.Action;
|
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
|
||||||
|
|
||||||
public class OpenInvPlayerListener implements Listener {
|
|
||||||
|
|
||||||
private final OpenInv plugin;
|
|
||||||
|
|
||||||
public OpenInvPlayerListener(OpenInv plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
|
||||||
public void onPlayerJoin(final PlayerJoinEvent event) {
|
|
||||||
plugin.setPlayerOnline(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
|
||||||
plugin.setPlayerOffline(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
|
||||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getPlayer().isSneaking()
|
|
||||||
|| event.useInteractedBlock() == Result.DENY
|
|
||||||
|| !plugin.getAnySilentContainer().isAnySilentContainer(event.getClickedBlock())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
boolean anychest = Permissions.ANYCHEST.hasPermission(player) && plugin.getPlayerAnyChestStatus(player);
|
|
||||||
boolean needsAnyChest = plugin.getAnySilentContainer().isAnyContainerNeeded(player, event.getClickedBlock());
|
|
||||||
|
|
||||||
if (!anychest && needsAnyChest) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean silentchest = Permissions.SILENT.hasPermission(player) && plugin.getPlayerSilentChestStatus(player);
|
|
||||||
|
|
||||||
// If anychest or silentchest is active
|
|
||||||
if ((anychest || silentchest) && plugin.getAnySilentContainer().activateContainer(player, silentchest, event.getClickedBlock())) {
|
|
||||||
if (silentchest && plugin.notifySilentChest() && needsAnyChest && plugin.notifyAnyChest()) {
|
|
||||||
player.sendMessage("You are opening a blocked container silently.");
|
|
||||||
} else if (silentchest && plugin.notifySilentChest()) {
|
|
||||||
player.sendMessage("You are opening a container silently.");
|
|
||||||
} else if (needsAnyChest && plugin.notifyAnyChest()) {
|
|
||||||
player.sendMessage("You are opening a blocked container.");
|
|
||||||
}
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package com.lishid.openinv;
|
|
||||||
|
|
||||||
import org.bukkit.permissions.Permissible;
|
|
||||||
|
|
||||||
public enum Permissions {
|
|
||||||
|
|
||||||
OPENINV("OpenInv.openinv"),
|
|
||||||
OVERRIDE("OpenInv.override"),
|
|
||||||
EXEMPT("OpenInv.exempt"),
|
|
||||||
CROSSWORLD("OpenInv.crossworld"),
|
|
||||||
SILENT("OpenInv.silent"),
|
|
||||||
ANYCHEST("OpenInv.anychest"),
|
|
||||||
ENDERCHEST("OpenInv.openender"),
|
|
||||||
ENDERCHEST_ALL("OpenInv.openenderall"),
|
|
||||||
SEARCH("OpenInv.search"),
|
|
||||||
EDITINV("OpenInv.editinv"),
|
|
||||||
EDITENDER("OpenInv.editender"),
|
|
||||||
OPENSELF("OpenInv.openself");
|
|
||||||
|
|
||||||
private final String permission;
|
|
||||||
|
|
||||||
private Permissions(String permission) {
|
|
||||||
this.permission = permission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasPermission(Permissible permissible) {
|
|
||||||
String[] parts = permission.split("\\.");
|
|
||||||
String perm = "";
|
|
||||||
for (int i = 0; i < parts.length; i++) {
|
|
||||||
if (permissible.hasPermission(perm + "*")) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
perm += parts[i] + ".";
|
|
||||||
}
|
|
||||||
return permissible.hasPermission(permission);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,141 +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.commands;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import com.lishid.openinv.OpenInv;
|
|
||||||
import com.lishid.openinv.Permissions;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandExecutor;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
|
||||||
|
|
||||||
public class OpenEnderPluginCommand implements CommandExecutor {
|
|
||||||
|
|
||||||
private final OpenInv plugin;
|
|
||||||
private final HashMap<Player, String> openEnderHistory = new HashMap<Player, String>();
|
|
||||||
|
|
||||||
public OpenEnderPluginCommand(OpenInv plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
|
||||||
if (!(sender instanceof Player)) {
|
|
||||||
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length > 0 && args[0].equalsIgnoreCase("?")) {
|
|
||||||
plugin.showHelp((Player) sender);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Player player = (Player) sender;
|
|
||||||
|
|
||||||
// History management
|
|
||||||
String history = openEnderHistory.get(player);
|
|
||||||
|
|
||||||
if (history == null || history == "") {
|
|
||||||
history = player.getName();
|
|
||||||
openEnderHistory.put(player, history);
|
|
||||||
}
|
|
||||||
|
|
||||||
final String name;
|
|
||||||
|
|
||||||
// Read from history if target is not named
|
|
||||||
if (args.length < 1) {
|
|
||||||
name = history;
|
|
||||||
} else {
|
|
||||||
name = args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
new BukkitRunnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
final OfflinePlayer offlinePlayer = plugin.matchPlayer(name);
|
|
||||||
|
|
||||||
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore() && !offlinePlayer.isOnline()) {
|
|
||||||
player.sendMessage(ChatColor.RED + "Player not found!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
new BukkitRunnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!player.isOnline()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
openInventory(player, offlinePlayer);
|
|
||||||
}
|
|
||||||
}.runTask(plugin);
|
|
||||||
|
|
||||||
}
|
|
||||||
}.runTaskAsynchronously(plugin);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void openInventory(Player player, OfflinePlayer target) {
|
|
||||||
|
|
||||||
Player onlineTarget;
|
|
||||||
boolean online = target.isOnline();
|
|
||||||
|
|
||||||
if (!online) {
|
|
||||||
// Try loading the player's data
|
|
||||||
onlineTarget = plugin.loadPlayer(target);
|
|
||||||
|
|
||||||
if (onlineTarget == null) {
|
|
||||||
player.sendMessage(ChatColor.RED + "Player not found!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
onlineTarget = target.getPlayer();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!onlineTarget.equals(player)) {
|
|
||||||
if (!Permissions.ENDERCHEST_ALL.hasPermission(player)) {
|
|
||||||
player.sendMessage(ChatColor.RED + "You do not have permission to access other players' enderchests.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!Permissions.CROSSWORLD.hasPermission(player) && !player.getWorld().equals(onlineTarget.getWorld())) {
|
|
||||||
player.sendMessage(ChatColor.RED + onlineTarget.getDisplayName() + " is not in your world!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!Permissions.OVERRIDE.hasPermission(player) && Permissions.EXEMPT.hasPermission(onlineTarget)) {
|
|
||||||
player.sendMessage(ChatColor.RED + onlineTarget.getDisplayName() + "'s inventory is protected!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record the target
|
|
||||||
openEnderHistory.put(player, onlineTarget.getName());
|
|
||||||
|
|
||||||
// Create the inventory
|
|
||||||
ISpecialEnderChest chest = plugin.getEnderChest(onlineTarget, online);
|
|
||||||
|
|
||||||
// Open the inventory
|
|
||||||
player.openInventory(chest.getBukkitInventory());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,148 +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.commands;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import com.lishid.openinv.OpenInv;
|
|
||||||
import com.lishid.openinv.Permissions;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandExecutor;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
|
||||||
|
|
||||||
public class OpenInvPluginCommand implements CommandExecutor {
|
|
||||||
|
|
||||||
private final OpenInv plugin;
|
|
||||||
private final HashMap<Player, String> openInvHistory = new HashMap<Player, String>();
|
|
||||||
|
|
||||||
public OpenInvPluginCommand(OpenInv plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
|
||||||
if (!(sender instanceof Player)) {
|
|
||||||
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length > 0 && args[0].equalsIgnoreCase("?")) {
|
|
||||||
plugin.showHelp((Player) sender);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Player player = (Player) sender;
|
|
||||||
|
|
||||||
// History management
|
|
||||||
String history = openInvHistory.get(player);
|
|
||||||
|
|
||||||
if (history == null || history == "") {
|
|
||||||
history = player.getName();
|
|
||||||
openInvHistory.put(player, history);
|
|
||||||
}
|
|
||||||
|
|
||||||
final String name;
|
|
||||||
|
|
||||||
// Read from history if target is not named
|
|
||||||
if (args.length < 1) {
|
|
||||||
name = history;
|
|
||||||
} else {
|
|
||||||
name = args[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
new BukkitRunnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
final OfflinePlayer offlinePlayer = plugin.matchPlayer(name);
|
|
||||||
|
|
||||||
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore() && !offlinePlayer.isOnline()) {
|
|
||||||
player.sendMessage(ChatColor.RED + "Player not found!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
new BukkitRunnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!player.isOnline()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
openInventory(player, offlinePlayer);
|
|
||||||
}
|
|
||||||
}.runTask(plugin);
|
|
||||||
|
|
||||||
}
|
|
||||||
}.runTaskAsynchronously(plugin);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void openInventory(Player player, OfflinePlayer target) {
|
|
||||||
|
|
||||||
|
|
||||||
Player onlineTarget;
|
|
||||||
boolean online = target.isOnline();
|
|
||||||
|
|
||||||
if (!online) {
|
|
||||||
// Try loading the player's data
|
|
||||||
onlineTarget = plugin.loadPlayer(target);
|
|
||||||
|
|
||||||
if (onlineTarget == null) {
|
|
||||||
player.sendMessage(ChatColor.RED + "Player not found!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
onlineTarget = target.getPlayer();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Permissions checks
|
|
||||||
if (onlineTarget.equals(player)) {
|
|
||||||
// Self-open check
|
|
||||||
if (!Permissions.OPENSELF.hasPermission(player)) {
|
|
||||||
player.sendMessage(ChatColor.RED + "You're not allowed to openinv yourself.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Protected check
|
|
||||||
if (!Permissions.OVERRIDE.hasPermission(player) && Permissions.EXEMPT.hasPermission(onlineTarget)) {
|
|
||||||
player.sendMessage(ChatColor.RED + onlineTarget.getDisplayName() + "'s inventory is protected!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Crossworld check
|
|
||||||
if ((!Permissions.CROSSWORLD.hasPermission(player) && !Permissions.OVERRIDE.hasPermission(player)) && onlineTarget.getWorld() != player.getWorld()) {
|
|
||||||
player.sendMessage(ChatColor.RED + onlineTarget.getDisplayName() + " is not in your world!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record the target
|
|
||||||
openInvHistory.put(player, onlineTarget.getName());
|
|
||||||
|
|
||||||
// Create the inventory
|
|
||||||
ISpecialPlayerInventory inv = plugin.getInventory(onlineTarget, online);
|
|
||||||
|
|
||||||
// Open the inventory
|
|
||||||
player.openInventory(inv.getBukkitInventory());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
package com.lishid.openinv.util;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
import com.google.common.collect.TreeMultimap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A minimal time-based cache implementation backed by a HashMap and TreeMultimap.
|
|
||||||
*
|
|
||||||
* @author Jikoo
|
|
||||||
*/
|
|
||||||
public class Cache<K, V> {
|
|
||||||
|
|
||||||
private final Map<K, V> internal;
|
|
||||||
private final Multimap<Long, K> expiry;
|
|
||||||
private final long retention;
|
|
||||||
private final Function<V> inUseCheck, postRemoval;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a Cache with the specified retention duration, in use function, and post-removal function.
|
|
||||||
*
|
|
||||||
* @param retention duration after which keys are automatically invalidated if not in use
|
|
||||||
* @param inUseCheck Function used to check if a key is considered in use
|
|
||||||
* @param postRemoval Function used to perform any operations required when a key is invalidated
|
|
||||||
*/
|
|
||||||
public Cache(long retention, Function<V> inUseCheck, Function<V> postRemoval) {
|
|
||||||
this.internal = new HashMap<K, V>();
|
|
||||||
|
|
||||||
this.expiry = TreeMultimap.create(new Comparator<Long>() {
|
|
||||||
@Override
|
|
||||||
public int compare(Long long1, Long long2) {
|
|
||||||
return long1.compareTo(long2);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new Comparator<K>() {
|
|
||||||
@Override
|
|
||||||
public int compare(K k1, K k2) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.retention = retention;
|
|
||||||
this.inUseCheck = inUseCheck;
|
|
||||||
this.postRemoval = postRemoval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a key and value pair. Keys are unique. Using an existing key will cause the old value to
|
|
||||||
* be overwritten and the expiration timer to be reset.
|
|
||||||
*
|
|
||||||
* @param key key with which the specified value is to be associated
|
|
||||||
* @param value value to be associated with the specified key
|
|
||||||
*/
|
|
||||||
public void put(K key, V value) {
|
|
||||||
// Invalidate key - runs lazy check and ensures value won't be cleaned up early
|
|
||||||
invalidate(key);
|
|
||||||
|
|
||||||
internal.put(key, value);
|
|
||||||
expiry.put(System.currentTimeMillis() + retention, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the value to which the specified key is mapped, or null if no value is mapped for the key.
|
|
||||||
*
|
|
||||||
* @param key the key whose associated value is to be returned
|
|
||||||
* @return the value to which the specified key is mapped, or null if no value is mapped for the key
|
|
||||||
*/
|
|
||||||
public V get(K key) {
|
|
||||||
// Run lazy check to clean cache
|
|
||||||
lazyCheck();
|
|
||||||
|
|
||||||
return internal.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the specified key is mapped to a value.
|
|
||||||
*
|
|
||||||
* @param key key to check if a mapping exists for
|
|
||||||
* @return true if a mapping exists for the specified key
|
|
||||||
*/
|
|
||||||
public boolean containsKey(K key) {
|
|
||||||
// Run lazy check to clean cache
|
|
||||||
lazyCheck();
|
|
||||||
|
|
||||||
return internal.containsKey(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forcibly invalidates a key, even if it is considered to be in use.
|
|
||||||
*
|
|
||||||
* @param key key to invalidate
|
|
||||||
*/
|
|
||||||
public void invalidate(K key) {
|
|
||||||
// Run lazy check to clean cache
|
|
||||||
lazyCheck();
|
|
||||||
|
|
||||||
if (!internal.containsKey(key)) {
|
|
||||||
// Value either not present or cleaned by lazy check. Either way, we're good
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove stored object
|
|
||||||
internal.remove(key);
|
|
||||||
|
|
||||||
// Remove expiration entry - prevents more work later, plus prevents issues with values invalidating early
|
|
||||||
for (Iterator<Map.Entry<Long, K>> iterator = expiry.entries().iterator(); iterator.hasNext();) {
|
|
||||||
if (key.equals(iterator.next().getValue())) {
|
|
||||||
iterator.remove();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forcibly invalidates all keys, even if they are considered to be in use.
|
|
||||||
*/
|
|
||||||
public void invalidateAll() {
|
|
||||||
for (V value : internal.values()) {
|
|
||||||
postRemoval.run(value);
|
|
||||||
}
|
|
||||||
expiry.clear();
|
|
||||||
internal.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invalidate all expired keys that are not considered in use. If a key is expired but is
|
|
||||||
* considered in use by the provided Function, its expiration time is reset.
|
|
||||||
*/
|
|
||||||
private void lazyCheck() {
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
long nextExpiry = now + retention;
|
|
||||||
for (Iterator<Map.Entry<Long, K>> iterator = expiry.entries().iterator(); iterator.hasNext();) {
|
|
||||||
Map.Entry<Long, K> entry = iterator.next();
|
|
||||||
|
|
||||||
if (entry.getKey() > now) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator.remove();
|
|
||||||
|
|
||||||
if (inUseCheck.run(internal.get(entry.getValue()))) {
|
|
||||||
expiry.put(nextExpiry, entry.getValue());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
V value = internal.remove(entry.getValue());
|
|
||||||
|
|
||||||
if (value == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
postRemoval.run(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package com.lishid.openinv.util;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstraction for some simple cache calls.
|
|
||||||
*
|
|
||||||
* @author Jikoo
|
|
||||||
*/
|
|
||||||
public abstract class Function<V> {
|
|
||||||
|
|
||||||
public abstract boolean run(V value);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
name: OpenInv
|
|
||||||
main: com.lishid.openinv.OpenInv
|
|
||||||
version: ${openinv.version}
|
|
||||||
author: lishid
|
|
||||||
authors: [Jikoo, ShadowRanger]
|
|
||||||
description: >
|
|
||||||
This plugin allows you to open a player's inventory as a chest and interact with it in real time.
|
|
||||||
commands:
|
|
||||||
openinv:
|
|
||||||
aliases: [oi, inv, open]
|
|
||||||
description: Open a player's inventory
|
|
||||||
permission: OpenInv.*;OpenInv.openinv
|
|
||||||
usage: |-
|
|
||||||
/<command> [Player] - Open a player's inventory
|
|
||||||
openender:
|
|
||||||
aliases: [oe]
|
|
||||||
description: Opens the enderchest of a player
|
|
||||||
permission: OpenInv.*;OpenInv.openender
|
|
||||||
usage: |-
|
|
||||||
/<command> [Player] - Open a player's enderchest
|
|
||||||
searchinv:
|
|
||||||
aliases: [si]
|
|
||||||
description: Search and list players having a specific item
|
|
||||||
permission: OpenInv.*;OpenInv.search
|
|
||||||
usage: |-
|
|
||||||
/<command> <Item> [MinAmount] - Item is the ID or the Bukkit Material, MinAmount is the minimum amount required
|
|
||||||
searchender:
|
|
||||||
aliases: [se]
|
|
||||||
permission: OpenInv.*;OpenInv.search
|
|
||||||
description: Searches and lists players having a specific item in their ender chest
|
|
||||||
usage: |-
|
|
||||||
/<command> <item> [minAmount] - Item is the ID or the Bukkit Material, MinAmount is the minimum amount required
|
|
||||||
silentchest:
|
|
||||||
aliases: [sc, silent]
|
|
||||||
description: Toggle silent chest function, which stops sounds and animations when using containers.
|
|
||||||
permission: OpenInv.*;OpenInv.silent
|
|
||||||
usage: |-
|
|
||||||
/<command> [Check] - Check or toggle silent chest
|
|
||||||
anychest:
|
|
||||||
aliases: [ac]
|
|
||||||
description: Toggle anychest function, which allows opening of blocked chests.
|
|
||||||
permission: OpenInv.*;OpenInv.anychest
|
|
||||||
usage: |-
|
|
||||||
/<command> [Check] - Checks or toggle anychest
|
|
||||||
|
|
||||||
168
pom.xml
168
pom.xml
@@ -1,168 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<packaging>pom</packaging>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
<name>OpenInv</name>
|
|
||||||
<url>http://dev.bukkit.org/bukkit-plugins/openinv/</url>
|
|
||||||
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<openinv.version>3.0.0-SNAPSHOT</openinv.version>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<profiles>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ N.B.: All dependencies for profiles are set in ./assembly/pom.xml
|
|
||||||
~
|
|
||||||
~ This is to prevent recursive dependencies. It's not ideal, but it works.
|
|
||||||
~ The parent project always builds first. Then, due to profile ordering here,
|
|
||||||
~ whatever modules are enabled are built. Finally, the assembly module is built,
|
|
||||||
~ which contains no actual code, but shades all its "dependencies" into one jar.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ This profile exists to simplify profile usage.
|
|
||||||
~ The interface and plugin modules should be built first to ensure that they are up to date.
|
|
||||||
-->
|
|
||||||
<profile>
|
|
||||||
<id>reactorbuildfirst</id>
|
|
||||||
<activation>
|
|
||||||
<property>
|
|
||||||
<name>!breakBuildProcess</name>
|
|
||||||
</property>
|
|
||||||
</activation>
|
|
||||||
<modules>
|
|
||||||
<module>internal</module>
|
|
||||||
<module>plugin</module>
|
|
||||||
</modules>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
<profile>
|
|
||||||
<id>latest</id>
|
|
||||||
<activation>
|
|
||||||
<property>
|
|
||||||
<name>latest</name>
|
|
||||||
<value>true</value>
|
|
||||||
</property>
|
|
||||||
</activation>
|
|
||||||
<modules>
|
|
||||||
<module>v1_11_R1</module>
|
|
||||||
</modules>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
<profile>
|
|
||||||
<id>modern</id>
|
|
||||||
<activation>
|
|
||||||
<property>
|
|
||||||
<name>modern</name>
|
|
||||||
<value>true</value>
|
|
||||||
</property>
|
|
||||||
</activation>
|
|
||||||
<modules>
|
|
||||||
<module>v1_8_R1</module>
|
|
||||||
<module>v1_8_R2</module>
|
|
||||||
<module>v1_8_R3</module>
|
|
||||||
<module>v1_9_R1</module>
|
|
||||||
<module>v1_9_R2</module>
|
|
||||||
<module>v1_10_R1</module>
|
|
||||||
<module>v1_11_R1</module>
|
|
||||||
</modules>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
<profile>
|
|
||||||
<id>all</id>
|
|
||||||
<activation>
|
|
||||||
<activeByDefault>true</activeByDefault>
|
|
||||||
</activation>
|
|
||||||
<modules>
|
|
||||||
<module>1_4_5</module>
|
|
||||||
<module>1_4_6</module>
|
|
||||||
<module>v1_4_R1</module>
|
|
||||||
<!-- 1_5_R1 was never released -->
|
|
||||||
<module>v1_5_R2</module>
|
|
||||||
<module>v1_5_R3</module>
|
|
||||||
<!-- 1_6_R1 also had no tagged releases, remove? -->
|
|
||||||
<module>v1_6_R1</module>
|
|
||||||
<module>v1_6_R2</module>
|
|
||||||
<module>v1_6_R3</module>
|
|
||||||
<!-- TODO: Recompile CB for 1_7_R1 through 1_7_R4, currently using whatever jars worked -->
|
|
||||||
<module>v1_7_R1</module>
|
|
||||||
<module>v1_7_R2</module>
|
|
||||||
<module>v1_7_R3</module>
|
|
||||||
<module>v1_7_R4</module>
|
|
||||||
<module>v1_8_R1</module>
|
|
||||||
<module>v1_8_R2</module>
|
|
||||||
<module>v1_8_R3</module>
|
|
||||||
<module>v1_9_R1</module>
|
|
||||||
<module>v1_9_R2</module>
|
|
||||||
<module>v1_10_R1</module>
|
|
||||||
<module>v1_11_R1</module>
|
|
||||||
</modules>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ This profile exists to fix reactor build order.
|
|
||||||
~ The assembly module must be built last to aggregate all active modules into the final jar.
|
|
||||||
-->
|
|
||||||
<profile>
|
|
||||||
<id>reactorbuildlast</id>
|
|
||||||
<activation>
|
|
||||||
<property>
|
|
||||||
<name>!breakBuildProcess</name>
|
|
||||||
</property>
|
|
||||||
</activation>
|
|
||||||
<modules>
|
|
||||||
<module>assembly</module>
|
|
||||||
</modules>
|
|
||||||
</profile>
|
|
||||||
|
|
||||||
</profiles>
|
|
||||||
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>spigot-repo</id>
|
|
||||||
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
|
||||||
<version>2.4.3</version>
|
|
||||||
<configuration>
|
|
||||||
<filters>
|
|
||||||
<filter>
|
|
||||||
<artifact>*:*</artifact>
|
|
||||||
<!-- Keep the file clean, don't include every single pom from all modules -->
|
|
||||||
<excludes>META-INF/maven/**</excludes>
|
|
||||||
</filter>
|
|
||||||
</filters>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>shade</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.5.1</version>
|
|
||||||
<configuration>
|
|
||||||
<source>1.6</source>
|
|
||||||
<target>1.6</target>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
206
src/com/lishid/openinv/OpenInv.java
Normal file
206
src/com/lishid/openinv/OpenInv.java
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.permissions.Permissible;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import com.lishid.openinv.commands.*;
|
||||||
|
import com.lishid.openinv.internal.IAnySilentChest;
|
||||||
|
import com.lishid.openinv.internal.IInventoryAccess;
|
||||||
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
|
import com.lishid.openinv.internal.ISpecialEnderChest;
|
||||||
|
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
||||||
|
import com.lishid.openinv.internal.InternalAccessor;
|
||||||
|
import com.lishid.openinv.utils.UpdateManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open other player's inventory
|
||||||
|
*
|
||||||
|
* @author lishid
|
||||||
|
*/
|
||||||
|
public class OpenInv extends JavaPlugin {
|
||||||
|
public static final Logger logger = Logger.getLogger("Minecraft.OpenInv");
|
||||||
|
|
||||||
|
public static HashMap<String, ISpecialPlayerInventory> inventories = new HashMap<String, ISpecialPlayerInventory>();
|
||||||
|
public static HashMap<String, ISpecialEnderChest> enderChests = new HashMap<String, ISpecialEnderChest>();
|
||||||
|
|
||||||
|
private UpdateManager updater = new UpdateManager();
|
||||||
|
|
||||||
|
public static OpenInv mainPlugin;
|
||||||
|
|
||||||
|
public static IPlayerDataManager playerLoader;
|
||||||
|
public static IInventoryAccess inventoryAccess;
|
||||||
|
public static IAnySilentChest anySilentChest;
|
||||||
|
|
||||||
|
public void onEnable() {
|
||||||
|
// Get plugin manager
|
||||||
|
PluginManager pm = getServer().getPluginManager();
|
||||||
|
|
||||||
|
// Version check
|
||||||
|
boolean success = InternalAccessor.Initialize(this.getServer());
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
OpenInv.log("Your version of CraftBukkit is not supported.");
|
||||||
|
OpenInv.log("Please look for an updated version of OpenInv.");
|
||||||
|
pm.disablePlugin(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
playerLoader = InternalAccessor.Instance.newPlayerDataManager();
|
||||||
|
inventoryAccess = InternalAccessor.Instance.newInventoryAccess();
|
||||||
|
anySilentChest = InternalAccessor.Instance.newAnySilentChest();
|
||||||
|
|
||||||
|
mainPlugin = this;
|
||||||
|
FileConfiguration config = getConfig();
|
||||||
|
config.set("CheckForUpdates", config.getBoolean("CheckForUpdates", true));
|
||||||
|
config.set("NotifySilentChest", config.getBoolean("NotifySilentChest", true));
|
||||||
|
config.set("NotifyAnyChest", config.getBoolean("NotifyAnyChest", true));
|
||||||
|
config.set("ItemOpenInvItemID", config.getInt("ItemOpenInvItemID", 280));
|
||||||
|
config.addDefault("ItemOpenInvItemID", 280);
|
||||||
|
config.addDefault("CheckForUpdates", true);
|
||||||
|
config.addDefault("NotifySilentChest", true);
|
||||||
|
config.addDefault("NotifyAnyChest", true);
|
||||||
|
config.options().copyDefaults(true);
|
||||||
|
saveConfig();
|
||||||
|
|
||||||
|
pm.registerEvents(new OpenInvPlayerListener(), this);
|
||||||
|
pm.registerEvents(new OpenInvEntityListener(), this);
|
||||||
|
pm.registerEvents(new OpenInvInventoryListener(), this);
|
||||||
|
|
||||||
|
getCommand("openinv").setExecutor(new OpenInvPluginCommand(this));
|
||||||
|
getCommand("searchinv").setExecutor(new SearchInvPluginCommand());
|
||||||
|
getCommand("toggleopeninv").setExecutor(new ToggleOpenInvPluginCommand());
|
||||||
|
getCommand("silentchest").setExecutor(new SilentChestPluginCommand(this));
|
||||||
|
getCommand("anychest").setExecutor(new AnyChestPluginCommand(this));
|
||||||
|
getCommand("openender").setExecutor(new OpenEnderPluginCommand(this));
|
||||||
|
|
||||||
|
updater.Initialize(this, getFile());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean NotifySilentChest() {
|
||||||
|
return mainPlugin.getConfig().getBoolean("NotifySilentChest", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean NotifyAnyChest() {
|
||||||
|
return mainPlugin.getConfig().getBoolean("NotifyAnyChest", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean GetCheckForUpdates() {
|
||||||
|
return mainPlugin.getConfig().getBoolean("CheckForUpdates", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean GetPlayerItemOpenInvStatus(String name) {
|
||||||
|
return mainPlugin.getConfig().getBoolean("ItemOpenInv." + name.toLowerCase() + ".toggle", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetPlayerItemOpenInvStatus(String name, boolean status) {
|
||||||
|
mainPlugin.getConfig().set("ItemOpenInv." + name.toLowerCase() + ".toggle", status);
|
||||||
|
mainPlugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean GetPlayerSilentChestStatus(String name) {
|
||||||
|
return mainPlugin.getConfig().getBoolean("SilentChest." + name.toLowerCase() + ".toggle", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetPlayerSilentChestStatus(String name, boolean status) {
|
||||||
|
mainPlugin.getConfig().set("SilentChest." + name.toLowerCase() + ".toggle", status);
|
||||||
|
mainPlugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean GetPlayerAnyChestStatus(String name) {
|
||||||
|
return mainPlugin.getConfig().getBoolean("AnyChest." + name.toLowerCase() + ".toggle", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetPlayerAnyChestStatus(String name, boolean status) {
|
||||||
|
mainPlugin.getConfig().set("AnyChest." + name.toLowerCase() + ".toggle", status);
|
||||||
|
mainPlugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int GetItemOpenInvItem() {
|
||||||
|
if (mainPlugin.getConfig().get("ItemOpenInvItemID") == null) {
|
||||||
|
SaveToConfig("ItemOpenInvItemID", 280);
|
||||||
|
}
|
||||||
|
return mainPlugin.getConfig().getInt("ItemOpenInvItemID", 280);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object GetFromConfig(String data, Object defaultValue) {
|
||||||
|
Object val = mainPlugin.getConfig().get(data);
|
||||||
|
if (val == null) {
|
||||||
|
mainPlugin.getConfig().set(data, defaultValue);
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SaveToConfig(String data, Object value) {
|
||||||
|
mainPlugin.getConfig().set(data, value);
|
||||||
|
mainPlugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an information
|
||||||
|
*/
|
||||||
|
public static void log(String text) {
|
||||||
|
logger.info("[OpenInv] " + text);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an error
|
||||||
|
*/
|
||||||
|
public static void log(Throwable e) {
|
||||||
|
logger.severe("[OpenInv] " + e.toString());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowHelp(Player player) {
|
||||||
|
player.sendMessage(ChatColor.GREEN + "/openinv <Player> - Open a player's inventory");
|
||||||
|
player.sendMessage(ChatColor.GREEN + " (aliases: oi, inv, open)");
|
||||||
|
player.sendMessage(ChatColor.GREEN + "/openender <Player> - Open a player's enderchest");
|
||||||
|
player.sendMessage(ChatColor.GREEN + " (aliases: oe, enderchest)");
|
||||||
|
player.sendMessage(ChatColor.GREEN + "/toggleopeninv - Toggle item openinv function");
|
||||||
|
player.sendMessage(ChatColor.GREEN + " (aliases: toi, toggleoi, toggleinv)");
|
||||||
|
player.sendMessage(ChatColor.GREEN + "/searchinv <Item> [MinAmount] - ");
|
||||||
|
player.sendMessage(ChatColor.GREEN + " Search and list players having a specific item.");
|
||||||
|
player.sendMessage(ChatColor.GREEN + " (aliases: si, search)");
|
||||||
|
player.sendMessage(ChatColor.GREEN + "/anychest - Toggle anychest function");
|
||||||
|
player.sendMessage(ChatColor.GREEN + " (aliases: ac)");
|
||||||
|
player.sendMessage(ChatColor.GREEN + "/silentchest - Toggle silent chest function");
|
||||||
|
player.sendMessage(ChatColor.GREEN + " (aliases: sc, silent)");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasPermission(Permissible player, String permission) {
|
||||||
|
String[] parts = permission.split("\\.");
|
||||||
|
String perm = "";
|
||||||
|
for (int i = 0; i < parts.length; i++) {
|
||||||
|
if (player.hasPermission(perm + "*")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
perm += parts[i] + ".";
|
||||||
|
}
|
||||||
|
return player.hasPermission(permission);
|
||||||
|
}
|
||||||
|
}
|
||||||
52
src/com/lishid/openinv/OpenInvEntityListener.java
Normal file
52
src/com/lishid/openinv/OpenInvEntityListener.java
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
public class OpenInvEntityListener implements Listener {
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void onEntityDamage(EntityDamageEvent event) {
|
||||||
|
if (event instanceof EntityDamageByEntityEvent) {
|
||||||
|
EntityDamageByEntityEvent evt = (EntityDamageByEntityEvent) event;
|
||||||
|
Entity attacker = evt.getDamager();
|
||||||
|
Entity defender = evt.getEntity();
|
||||||
|
|
||||||
|
if (!(attacker instanceof Player) || !(defender instanceof Player)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) attacker;
|
||||||
|
|
||||||
|
if (!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem()) || (!OpenInv.GetPlayerItemOpenInvStatus(player.getName())) || !OpenInv.hasPermission(player, "OpenInv.openinv")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player target = (Player) defender;
|
||||||
|
player.performCommand("openinv " + target.getName());
|
||||||
|
|
||||||
|
evt.setDamage(0);
|
||||||
|
evt.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
src/com/lishid/openinv/OpenInvInventoryListener.java
Normal file
35
src/com/lishid/openinv/OpenInvInventoryListener.java
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
|
||||||
|
public class OpenInvInventoryListener implements Listener {
|
||||||
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
|
// If this is the top inventory
|
||||||
|
// if (event.getView().convertSlot(event.getRawSlot()) == event.getRawSlot())
|
||||||
|
// {
|
||||||
|
if (!OpenInv.inventoryAccess.check(event.getInventory(), event.getWhoClicked())) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
133
src/com/lishid/openinv/OpenInvPlayerListener.java
Normal file
133
src/com/lishid/openinv/OpenInvPlayerListener.java
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.block.Chest;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Event.Result;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
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 com.lishid.openinv.internal.ISpecialEnderChest;
|
||||||
|
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
||||||
|
|
||||||
|
public class OpenInvPlayerListener implements Listener {
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
|
ISpecialPlayerInventory inventory = OpenInv.inventories.get(event.getPlayer().getName().toLowerCase());
|
||||||
|
|
||||||
|
if (inventory != null) {
|
||||||
|
inventory.PlayerGoOnline(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
ISpecialEnderChest chest = OpenInv.enderChests.get(event.getPlayer().getName().toLowerCase());
|
||||||
|
|
||||||
|
if (chest != null) {
|
||||||
|
chest.PlayerGoOnline(event.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
|
ISpecialPlayerInventory inventory = OpenInv.inventories.get(event.getPlayer().getName().toLowerCase());
|
||||||
|
if (inventory != null) {
|
||||||
|
inventory.PlayerGoOffline();
|
||||||
|
}
|
||||||
|
ISpecialEnderChest chest = OpenInv.enderChests.get(event.getPlayer().getName().toLowerCase());
|
||||||
|
if (chest != null) {
|
||||||
|
chest.PlayerGoOffline();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
if (event.getPlayer().isSneaking()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.useInteractedBlock() == Result.DENY) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == org.bukkit.Material.ENDER_CHEST) {
|
||||||
|
if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && OpenInv.GetPlayerSilentChestStatus(player.getName())) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
player.openInventory(player.getEnderChest());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getState() instanceof Chest) {
|
||||||
|
boolean silentchest = false;
|
||||||
|
boolean anychest = false;
|
||||||
|
int x = event.getClickedBlock().getX();
|
||||||
|
int y = event.getClickedBlock().getY();
|
||||||
|
int z = event.getClickedBlock().getZ();
|
||||||
|
|
||||||
|
if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && OpenInv.GetPlayerSilentChestStatus(player.getName())) {
|
||||||
|
silentchest = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OpenInv.hasPermission(player, Permissions.PERM_ANYCHEST) && OpenInv.GetPlayerAnyChestStatus(player.getName())) {
|
||||||
|
try {
|
||||||
|
anychest = OpenInv.anySilentChest.IsAnyChestNeeded(player, x, y, z);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
player.sendMessage(ChatColor.RED + "Error while executing openinv. Unsupported CraftBukkit.");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the anychest or silentchest is active
|
||||||
|
if (anychest || silentchest) {
|
||||||
|
if (!OpenInv.anySilentChest.ActivateChest(player, anychest, silentchest, x, y, z)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getState() instanceof Sign) {
|
||||||
|
try {
|
||||||
|
Sign sign = ((Sign) event.getClickedBlock().getState());
|
||||||
|
if (OpenInv.hasPermission(player, Permissions.PERM_OPENINV) && sign.getLine(0).equalsIgnoreCase("[openinv]")) {
|
||||||
|
String text = sign.getLine(1).trim() + sign.getLine(2).trim() + sign.getLine(3).trim();
|
||||||
|
player.performCommand("openinv " + text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
player.sendMessage("Internal Error.");
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||||
|
if (!(player.getItemInHand().getType().getId() == OpenInv.GetItemOpenInvItem()) || (!OpenInv.GetPlayerItemOpenInvStatus(player.getName())) || !OpenInv.hasPermission(player, Permissions.PERM_OPENINV)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
player.performCommand("openinv");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/com/lishid/openinv/Permissions.java
Normal file
16
src/com/lishid/openinv/Permissions.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package com.lishid.openinv;
|
||||||
|
|
||||||
|
public class Permissions {
|
||||||
|
public static final String PERM_OPENINV = "OpenInv.openinv";
|
||||||
|
public static final String PERM_OVERRIDE = "OpenInv.override";
|
||||||
|
public static final String PERM_EXEMPT = "OpenInv.exempt";
|
||||||
|
public static final String PERM_CROSSWORLD = "OpenInv.crossworld";
|
||||||
|
public static final String PERM_SILENT = "OpenInv.silent";
|
||||||
|
public static final String PERM_ANYCHEST = "OpenInv.anychest";
|
||||||
|
public static final String PERM_ENDERCHEST = "OpenInv.openender";
|
||||||
|
public static final String PERM_ENDERCHEST_ALL = "OpenInv.openenderall";
|
||||||
|
public static final String PERM_SEARCH = "OpenInv.search";
|
||||||
|
public static final String PERM_EDITINV = "OpenInv.editinv";
|
||||||
|
public static final String PERM_EDITENDER = "OpenInv.editender";
|
||||||
|
public static final String PERM_OPENSELF = "OpenInv.openself";
|
||||||
|
}
|
||||||
@@ -23,13 +23,11 @@ import org.bukkit.command.CommandSender;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.lishid.openinv.OpenInv;
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.Permissions;
|
||||||
|
|
||||||
public class AnyChestPluginCommand implements CommandExecutor {
|
public class AnyChestPluginCommand implements CommandExecutor {
|
||||||
|
|
||||||
private final OpenInv plugin;
|
|
||||||
|
|
||||||
public AnyChestPluginCommand(OpenInv plugin) {
|
public AnyChestPluginCommand(OpenInv plugin) {
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
@@ -37,18 +35,23 @@ public class AnyChestPluginCommand implements CommandExecutor {
|
|||||||
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (!OpenInv.hasPermission(sender, Permissions.PERM_ANYCHEST)) {
|
||||||
Player player = (Player) sender;
|
sender.sendMessage(ChatColor.RED + "You do not have permission to use anychest.");
|
||||||
|
|
||||||
if (args.length > 0 && args[0].equalsIgnoreCase("check")) {
|
|
||||||
sender.sendMessage("AnyChest is " + (plugin.getPlayerAnyChestStatus(player) ? "ON" : "OFF") + ".");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.setPlayerAnyChestStatus(player, !plugin.getPlayerAnyChestStatus(player));
|
if (args.length > 0) {
|
||||||
sender.sendMessage("AnyChest is now " + (plugin.getPlayerAnyChestStatus(player) ? "ON" : "OFF") + ".");
|
if (args[0].equalsIgnoreCase("check")) {
|
||||||
|
if (OpenInv.GetPlayerAnyChestStatus(sender.getName()))
|
||||||
|
sender.sendMessage("AnyChest is ON.");
|
||||||
|
else
|
||||||
|
sender.sendMessage("AnyChest is OFF.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenInv.SetPlayerAnyChestStatus(sender.getName(), !OpenInv.GetPlayerAnyChestStatus(sender.getName()));
|
||||||
|
sender.sendMessage("AnyChest is now " + (OpenInv.GetPlayerAnyChestStatus(sender.getName()) ? "On" : "Off") + ".");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
118
src/com/lishid/openinv/commands/OpenEnderPluginCommand.java
Normal file
118
src/com/lishid/openinv/commands/OpenEnderPluginCommand.java
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* 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.commands;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.Permissions;
|
||||||
|
import com.lishid.openinv.internal.ISpecialEnderChest;
|
||||||
|
import com.lishid.openinv.internal.InternalAccessor;
|
||||||
|
|
||||||
|
public class OpenEnderPluginCommand implements CommandExecutor {
|
||||||
|
private final OpenInv plugin;
|
||||||
|
public static HashMap<Player, String> openEnderHistory = new HashMap<Player, String>();
|
||||||
|
|
||||||
|
public OpenEnderPluginCommand(OpenInv plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
if (!(sender instanceof Player)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!OpenInv.hasPermission(sender, Permissions.PERM_ENDERCHEST)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You do not have permission to access player enderchest");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length > 0 && args[0].equalsIgnoreCase("?")) {
|
||||||
|
OpenInv.ShowHelp((Player) sender);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) sender;
|
||||||
|
boolean offline = false;
|
||||||
|
|
||||||
|
// History management
|
||||||
|
String history = openEnderHistory.get(player);
|
||||||
|
|
||||||
|
if (history == null || history == "") {
|
||||||
|
history = player.getName();
|
||||||
|
openEnderHistory.put(player, history);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Target selecting
|
||||||
|
Player target;
|
||||||
|
|
||||||
|
String name = "";
|
||||||
|
|
||||||
|
// Read from history if target is not named
|
||||||
|
if (args.length < 1) {
|
||||||
|
if (history != null && history != "") {
|
||||||
|
name = history;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.sendMessage(ChatColor.RED + "OpenEnder history is empty!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
name = args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
target = this.plugin.getServer().getPlayer(name);
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
// Try loading the player's data
|
||||||
|
target = OpenInv.playerLoader.loadPlayer(name);
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "Player " + name + " not found!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target != sender && !OpenInv.hasPermission(sender, Permissions.PERM_ENDERCHEST_ALL)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You do not have permission to access other player's enderchest");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Record the target
|
||||||
|
history = target.getName();
|
||||||
|
openEnderHistory.put(player, history);
|
||||||
|
|
||||||
|
// Create the inventory
|
||||||
|
ISpecialEnderChest chest = OpenInv.enderChests.get(target.getName().toLowerCase());
|
||||||
|
if (chest == null) {
|
||||||
|
chest = InternalAccessor.Instance.newSpecialEnderChest(target, !offline);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the inventory
|
||||||
|
player.openInventory(chest.getBukkitInventory());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
126
src/com/lishid/openinv/commands/OpenInvPluginCommand.java
Normal file
126
src/com/lishid/openinv/commands/OpenInvPluginCommand.java
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* 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.commands;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.Permissions;
|
||||||
|
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
||||||
|
import com.lishid.openinv.internal.InternalAccessor;
|
||||||
|
|
||||||
|
public class OpenInvPluginCommand implements CommandExecutor {
|
||||||
|
private final OpenInv plugin;
|
||||||
|
public static HashMap<Player, String> openInvHistory = new HashMap<Player, String>();
|
||||||
|
|
||||||
|
public OpenInvPluginCommand(OpenInv plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
if (!(sender instanceof Player)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!OpenInv.hasPermission(sender, Permissions.PERM_OPENINV)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length > 0 && args[0].equalsIgnoreCase("?")) {
|
||||||
|
OpenInv.ShowHelp((Player) sender);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) sender;
|
||||||
|
boolean offline = false;
|
||||||
|
|
||||||
|
// History management
|
||||||
|
String history = openInvHistory.get(player);
|
||||||
|
|
||||||
|
if (history == null || history == "") {
|
||||||
|
history = player.getName();
|
||||||
|
openInvHistory.put(player, history);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Target selecting
|
||||||
|
Player target;
|
||||||
|
|
||||||
|
String name = "";
|
||||||
|
|
||||||
|
// Read from history if target is not named
|
||||||
|
if (args.length < 1) {
|
||||||
|
name = history;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
name = args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
target = this.plugin.getServer().getPlayer(name);
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
if (target == null) {
|
||||||
|
// Try loading the player's data
|
||||||
|
target = OpenInv.playerLoader.loadPlayer(name);
|
||||||
|
|
||||||
|
if (target == null) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "Player " + name + " not found!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Permissions checks
|
||||||
|
if (!OpenInv.hasPermission(player, Permissions.PERM_OVERRIDE) && OpenInv.hasPermission(target, Permissions.PERM_EXEMPT)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + target.getDisplayName() + "'s inventory is protected!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crosswork check
|
||||||
|
if ((!OpenInv.hasPermission(player, Permissions.PERM_CROSSWORLD) && !OpenInv.hasPermission(player, Permissions.PERM_OVERRIDE)) && target.getWorld() != player.getWorld()) {
|
||||||
|
sender.sendMessage(ChatColor.RED + target.getDisplayName() + " is not in your world!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Self-open check
|
||||||
|
if (!OpenInv.hasPermission(player, Permissions.PERM_OPENSELF) && target.equals(player)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You're not allowed to openinv yourself.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Record the target
|
||||||
|
history = target.getName();
|
||||||
|
openInvHistory.put(player, history);
|
||||||
|
|
||||||
|
// Create the inventory
|
||||||
|
ISpecialPlayerInventory inv = OpenInv.inventories.get(target.getName().toLowerCase());
|
||||||
|
if (inv == null) {
|
||||||
|
inv = InternalAccessor.Instance.newSpecialPlayerInventory(target, !offline);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the inventory
|
||||||
|
player.openInventory(inv.getBukkitInventory());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,12 +23,24 @@ import org.bukkit.command.Command;
|
|||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.Permissions;
|
||||||
|
|
||||||
public class SearchInvPluginCommand implements CommandExecutor {
|
public class SearchInvPluginCommand implements CommandExecutor {
|
||||||
|
public SearchInvPluginCommand() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@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 (!OpenInv.hasPermission(sender, Permissions.PERM_SEARCH)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String PlayerList = "";
|
||||||
|
|
||||||
Material material = null;
|
Material material = null;
|
||||||
int count = 1;
|
int count = 1;
|
||||||
@@ -38,11 +50,11 @@ public class SearchInvPluginCommand implements CommandExecutor {
|
|||||||
gData = args[0].split(":");
|
gData = args[0].split(":");
|
||||||
material = Material.matchMaterial(gData[0]);
|
material = Material.matchMaterial(gData[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.length >= 2) {
|
if (args.length >= 2) {
|
||||||
try {
|
try {
|
||||||
count = Integer.parseInt(args[1]);
|
count = Integer.parseInt(args[1]);
|
||||||
} catch (NumberFormatException ex) {
|
}
|
||||||
|
catch (NumberFormatException ex) {
|
||||||
sender.sendMessage(ChatColor.RED + "'" + args[1] + "' is not a number!");
|
sender.sendMessage(ChatColor.RED + "'" + args[1] + "' is not a number!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -53,23 +65,13 @@ public class SearchInvPluginCommand implements CommandExecutor {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder players = new StringBuilder();
|
for (Player templayer : Bukkit.getServer().getOnlinePlayers()) {
|
||||||
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
|
if (templayer.getInventory().contains(material, count)) {
|
||||||
Inventory inventory = command.getName().equals("searchinv") ? player.getInventory() : player.getEnderChest();
|
PlayerList += templayer.getName() + " ";
|
||||||
if (inventory.contains(material, count)) {
|
|
||||||
players.append(player.getName()).append(", ");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches found, delete trailing comma and space
|
sender.sendMessage("Players with the item " + material.toString() + ": " + PlayerList);
|
||||||
if (players.length() > 0) {
|
|
||||||
players.delete(players.length() - 2, players.length());
|
|
||||||
} else {
|
|
||||||
sender.sendMessage("No players found with " + material.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
sender.sendMessage("Players with the item " + material.toString() + ": " + players.toString());
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -23,13 +23,11 @@ import org.bukkit.command.CommandSender;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.lishid.openinv.OpenInv;
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.Permissions;
|
||||||
|
|
||||||
public class SilentChestPluginCommand implements CommandExecutor {
|
public class SilentChestPluginCommand implements CommandExecutor {
|
||||||
|
|
||||||
private final OpenInv plugin;
|
|
||||||
|
|
||||||
public SilentChestPluginCommand(OpenInv plugin) {
|
public SilentChestPluginCommand(OpenInv plugin) {
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
@@ -37,16 +35,22 @@ public class SilentChestPluginCommand implements CommandExecutor {
|
|||||||
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (!OpenInv.hasPermission(sender, Permissions.PERM_SILENT)) {
|
||||||
Player player = (Player) sender;
|
sender.sendMessage(ChatColor.RED + "You do not have permission to use silent chest.");
|
||||||
|
|
||||||
if (args.length > 0 && args[0].equalsIgnoreCase("check")) {
|
|
||||||
sender.sendMessage("SilentChest is " + (plugin.getPlayerAnyChestStatus(player) ? "ON" : "OFF") + ".");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.setPlayerSilentChestStatus(player, !plugin.getPlayerSilentChestStatus(player));
|
if (args.length > 0) {
|
||||||
sender.sendMessage("SilentChest is now " + (plugin.getPlayerSilentChestStatus(player) ? "ON" : "OFF") + ".");
|
if (args[0].equalsIgnoreCase("check")) {
|
||||||
|
if (OpenInv.GetPlayerSilentChestStatus(sender.getName()))
|
||||||
|
sender.sendMessage("SilentChest is ON.");
|
||||||
|
else
|
||||||
|
sender.sendMessage("SilentChest is OFF.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenInv.SetPlayerSilentChestStatus(sender.getName(), !OpenInv.GetPlayerSilentChestStatus(sender.getName()));
|
||||||
|
sender.sendMessage("SilentChest is now " + (OpenInv.GetPlayerSilentChestStatus(sender.getName()) ? "On" : "Off") + ".");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* 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.commands;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.Permissions;
|
||||||
|
|
||||||
|
public class ToggleOpenInvPluginCommand implements CommandExecutor {
|
||||||
|
|
||||||
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
|
if (!(sender instanceof Player)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You can't use this from the console.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!OpenInv.hasPermission(sender, Permissions.PERM_OPENINV)) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) sender;
|
||||||
|
if (args.length > 0) {
|
||||||
|
if (args[0].equalsIgnoreCase("check")) {
|
||||||
|
if (OpenInv.GetPlayerItemOpenInvStatus(player.getName()))
|
||||||
|
player.sendMessage("OpenInv with " + Material.getMaterial(OpenInv.GetItemOpenInvItem()).toString() + " is ON.");
|
||||||
|
else
|
||||||
|
player.sendMessage("OpenInv with " + Material.getMaterial(OpenInv.GetItemOpenInvItem()).toString() + " is OFF.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (OpenInv.GetPlayerItemOpenInvStatus(player.getName())) {
|
||||||
|
OpenInv.SetPlayerItemOpenInvStatus(player.getName(), false);
|
||||||
|
player.sendMessage("OpenInv with " + Material.getMaterial(OpenInv.GetItemOpenInvItem()).toString() + " is OFF.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
OpenInv.SetPlayerItemOpenInvStatus(player.getName(), true);
|
||||||
|
player.sendMessage("OpenInv with " + Material.getMaterial(OpenInv.GetItemOpenInvItem()).toString() + " is ON.");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/com/lishid/openinv/internal/IAnySilentChest.java
Normal file
25
src/com/lishid/openinv/internal/IAnySilentChest.java
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* 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.entity.Player;
|
||||||
|
|
||||||
|
public interface IAnySilentChest {
|
||||||
|
public boolean IsAnyChestNeeded(Player p, int x, int y, int z);
|
||||||
|
|
||||||
|
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z);
|
||||||
|
}
|
||||||
24
src/com/lishid/openinv/internal/IInventoryAccess.java
Normal file
24
src/com/lishid/openinv/internal/IInventoryAccess.java
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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.entity.HumanEntity;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
|
||||||
|
public interface IInventoryAccess {
|
||||||
|
public boolean check(Inventory inventory, HumanEntity player);
|
||||||
|
}
|
||||||
@@ -16,27 +16,8 @@
|
|||||||
|
|
||||||
package com.lishid.openinv.internal;
|
package com.lishid.openinv.internal;
|
||||||
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public interface IPlayerDataManager {
|
public interface IPlayerDataManager {
|
||||||
|
public Player loadPlayer(String name);
|
||||||
/**
|
|
||||||
* Loads a Player for an OfflinePlayer.
|
|
||||||
* </p>
|
|
||||||
* This method is potentially blocking, and should not be called on the main thread.
|
|
||||||
*
|
|
||||||
* @param offline
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public Player loadPlayer(OfflinePlayer offline);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a unique identifying string for an OfflinePlayer.
|
|
||||||
*
|
|
||||||
* @param player
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public String getPlayerDataID(OfflinePlayer player);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -20,31 +20,12 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
|
|
||||||
public interface ISpecialEnderChest {
|
public interface ISpecialEnderChest {
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the Inventory associated with this ISpecialEnderChest.
|
|
||||||
*
|
|
||||||
* @return the Inventory
|
|
||||||
*/
|
|
||||||
public Inventory getBukkitInventory();
|
public Inventory getBukkitInventory();
|
||||||
|
|
||||||
/**
|
public void InventoryRemovalCheck();
|
||||||
* Sets the Player associated with this ISpecialEnderChest online.
|
|
||||||
*
|
|
||||||
* @param player the Player coming online
|
|
||||||
*/
|
|
||||||
public void setPlayerOnline(Player player);
|
|
||||||
|
|
||||||
/**
|
public void PlayerGoOnline(Player p);
|
||||||
* Sets the Player associated with this ISpecialEnderChest offline.
|
|
||||||
*/
|
|
||||||
public void setPlayerOffline();
|
|
||||||
|
|
||||||
/**
|
public void PlayerGoOffline();
|
||||||
* Gets whether or not this ISpecialEnderChest is in use.
|
|
||||||
*
|
|
||||||
* @return true if the ISpecialEnderChest is in use
|
|
||||||
*/
|
|
||||||
public boolean isInUse();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -20,31 +20,11 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
|
|
||||||
public interface ISpecialPlayerInventory {
|
public interface ISpecialPlayerInventory {
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the Inventory associated with this ISpecialPlayerInventory.
|
|
||||||
*
|
|
||||||
* @return the Inventory
|
|
||||||
*/
|
|
||||||
public Inventory getBukkitInventory();
|
public Inventory getBukkitInventory();
|
||||||
|
|
||||||
/**
|
public void InventoryRemovalCheck();
|
||||||
* Sets the Player associated with this ISpecialPlayerInventory online.
|
|
||||||
*
|
|
||||||
* @param player the Player coming online
|
|
||||||
*/
|
|
||||||
public void setPlayerOnline(Player player);
|
|
||||||
|
|
||||||
/**
|
public void PlayerGoOnline(Player p);
|
||||||
* Sets the Player associated with this ISpecialPlayerInventory offline.
|
|
||||||
*/
|
|
||||||
public void setPlayerOffline();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets whether or not this ISpecialPlayerInventory is in use.
|
|
||||||
*
|
|
||||||
* @return true if the ISpecialPlayerInventory is in use
|
|
||||||
*/
|
|
||||||
public boolean isInUse();
|
|
||||||
|
|
||||||
|
public void PlayerGoOffline();
|
||||||
}
|
}
|
||||||
105
src/com/lishid/openinv/internal/InternalAccessor.java
Normal file
105
src/com/lishid/openinv/internal/InternalAccessor.java
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* 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.Server;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
|
||||||
|
public class InternalAccessor {
|
||||||
|
public static InternalAccessor Instance;
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns false if version not supported
|
||||||
|
*/
|
||||||
|
public static boolean Initialize(Server server) {
|
||||||
|
Instance = new InternalAccessor();
|
||||||
|
String packageName = server.getClass().getPackage().getName();
|
||||||
|
Instance.version = packageName.substring(packageName.lastIndexOf('.') + 1);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class.forName("com.lishid.openinv.internal." + Instance.version + ".AnySilentChest");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrintError() {
|
||||||
|
OpenInv.log("OpenInv encountered an error with the CraftBukkit version \"" + Instance.version + "\". Please look for an updated version of OpenInv.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPlayerDataManager newPlayerDataManager() {
|
||||||
|
return (IPlayerDataManager) createObject(IPlayerDataManager.class, "PlayerDataManager");
|
||||||
|
}
|
||||||
|
|
||||||
|
public IInventoryAccess newInventoryAccess() {
|
||||||
|
return (IInventoryAccess) createObject(IInventoryAccess.class, "InventoryAccess");
|
||||||
|
}
|
||||||
|
|
||||||
|
public IAnySilentChest newAnySilentChest() {
|
||||||
|
return (IAnySilentChest) createObject(IAnySilentChest.class, "AnySilentChest");
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISpecialPlayerInventory newSpecialPlayerInventory(Player player, boolean offline) {
|
||||||
|
try {
|
||||||
|
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialPlayerInventory");
|
||||||
|
if (ISpecialPlayerInventory.class.isAssignableFrom(internalClass)) {
|
||||||
|
return (ISpecialPlayerInventory) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
PrintError();
|
||||||
|
OpenInv.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISpecialEnderChest newSpecialEnderChest(Player player, boolean offline) {
|
||||||
|
try {
|
||||||
|
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialEnderChest");
|
||||||
|
if (ISpecialEnderChest.class.isAssignableFrom(internalClass)) {
|
||||||
|
return (ISpecialEnderChest) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
PrintError();
|
||||||
|
OpenInv.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object createObject(Class<? extends Object> assignableClass, String className) {
|
||||||
|
try {
|
||||||
|
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + "." + className);
|
||||||
|
if (assignableClass.isAssignableFrom(internalClass)) {
|
||||||
|
return internalClass.getConstructor().newInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
PrintError();
|
||||||
|
OpenInv.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
119
src/com/lishid/openinv/internal/v1_8_R1/AnySilentChest.java
Normal file
119
src/com/lishid/openinv/internal/v1_8_R1/AnySilentChest.java
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* 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_8_R1;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.internal.IAnySilentChest;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Volatile
|
||||||
|
import net.minecraft.server.v1_8_R1.*;
|
||||||
|
|
||||||
|
import org.bukkit.craftbukkit.v1_8_R1.entity.*;
|
||||||
|
|
||||||
|
public class AnySilentChest implements IAnySilentChest {
|
||||||
|
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 on top
|
||||||
|
if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c())
|
||||||
|
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 on top
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
|
||||||
|
return true;
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
|
||||||
|
return true;
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
|
||||||
|
return true;
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = (TileEntityChest) 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)).getBlock().c())
|
||||||
|
return true;
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
|
||||||
|
return true;
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
|
||||||
|
return true;
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
|
||||||
|
return true;
|
||||||
|
if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
|
||||||
|
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);
|
||||||
|
if (OpenInv.NotifySilentChest()) {
|
||||||
|
p.sendMessage("You are opening a chest silently.");
|
||||||
|
}
|
||||||
|
returnValue = false;
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anychest && OpenInv.NotifyAnyChest()) {
|
||||||
|
p.sendMessage("You are opening a blocked chest.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
72
src/com/lishid/openinv/internal/v1_8_R1/InventoryAccess.java
Normal file
72
src/com/lishid/openinv/internal/v1_8_R1/InventoryAccess.java
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* 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_8_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_8_R1.*;
|
||||||
|
import org.bukkit.craftbukkit.v1_8_R1.inventory.*;
|
||||||
|
|
||||||
|
public class InventoryAccess implements IInventoryAccess {
|
||||||
|
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 iiventory
|
||||||
|
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) {
|
||||||
|
OpenInv.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
104
src/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java
Normal file
104
src/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* 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_8_R1;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
|
import com.mojang.authlib.GameProfile;
|
||||||
|
|
||||||
|
//Volatile
|
||||||
|
import net.minecraft.server.v1_8_R1.*;
|
||||||
|
|
||||||
|
import org.bukkit.craftbukkit.v1_8_R1.*;
|
||||||
|
|
||||||
|
public class PlayerDataManager implements IPlayerDataManager {
|
||||||
|
public Player loadPlayer(String name) {
|
||||||
|
try {
|
||||||
|
UUID uuid = matchUser(name);
|
||||||
|
if (uuid == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default player folder
|
||||||
|
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "playerdata");
|
||||||
|
if (!playerfolder.exists()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
|
||||||
|
if (player == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
GameProfile profile = new GameProfile(uuid, player.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
OpenInv.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static UUID matchUser(String search) {
|
||||||
|
UUID found = null;
|
||||||
|
|
||||||
|
String lowerSearch = search.toLowerCase();
|
||||||
|
int delta = 2147483647;
|
||||||
|
|
||||||
|
OfflinePlayer[] offlinePlayers = Bukkit.getOfflinePlayers();
|
||||||
|
for (OfflinePlayer player : offlinePlayers) {
|
||||||
|
String name = player.getName();
|
||||||
|
|
||||||
|
if (name == null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (name.equalsIgnoreCase(search)){
|
||||||
|
return player.getUniqueId();
|
||||||
|
}
|
||||||
|
if (name.toLowerCase().startsWith(lowerSearch)) {
|
||||||
|
int curDelta = name.length() - lowerSearch.length();
|
||||||
|
if (curDelta < delta) {
|
||||||
|
found = player.getUniqueId();
|
||||||
|
delta = curDelta;
|
||||||
|
}
|
||||||
|
if (curDelta == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,30 +17,20 @@
|
|||||||
package com.lishid.openinv.internal.v1_8_R1;
|
package com.lishid.openinv.internal.v1_8_R1;
|
||||||
|
|
||||||
//Volatile
|
//Volatile
|
||||||
import net.minecraft.server.v1_8_R1.ContainerChest;
|
import net.minecraft.server.v1_8_R1.*;
|
||||||
import net.minecraft.server.v1_8_R1.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_8_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_8_R1.ItemStack;
|
|
||||||
import net.minecraft.server.v1_8_R1.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest {
|
public class SilentContainerChest extends ContainerChest {
|
||||||
|
public IInventory inv;
|
||||||
|
|
||||||
public SilentContainerChest(IInventory i1, IInventory i2, EntityHuman e1) {
|
public SilentContainerChest(IInventory i1, IInventory i2, EntityHuman e1) {
|
||||||
super(i1, i2, e1);
|
super(i1, i2, e1);
|
||||||
// Send close signal
|
inv = i2;
|
||||||
i2.closeContainer(e1);
|
// close signal
|
||||||
|
inv.closeContainer(e1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void b(EntityHuman entityHuman) {
|
public void b(EntityHuman paramEntityHuman) {
|
||||||
// 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) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(null);
|
|
||||||
entityHuman.drop(carried, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -14,12 +14,13 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.lishid.openinv.internal.v1_4_6;
|
package com.lishid.openinv.internal.v1_8_R1;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
import com.lishid.openinv.internal.ISpecialEnderChest;
|
||||||
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
@@ -27,102 +28,99 @@ 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;
|
||||||
|
|
||||||
// Volatile
|
//Volatile
|
||||||
import net.minecraft.server.v1_4_6.IInventory;
|
import net.minecraft.server.v1_8_R1.*;
|
||||||
import net.minecraft.server.v1_4_6.InventoryEnderChest;
|
import org.bukkit.craftbukkit.v1_8_R1.entity.*;
|
||||||
import net.minecraft.server.v1_4_6.InventorySubcontainer;
|
import org.bukkit.craftbukkit.v1_8_R1.inventory.*;
|
||||||
import net.minecraft.server.v1_4_6.ItemStack;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_6.entity.CraftHumanEntity;
|
|
||||||
import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
|
|
||||||
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 {
|
||||||
|
public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
|
||||||
private final InventoryEnderChest enderChest;
|
public boolean playerOnline = false;
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private final List<HumanEntity> transaction = new ArrayList<HumanEntity>();
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
private CraftPlayer owner;
|
private CraftPlayer owner;
|
||||||
|
private InventoryEnderChest enderChest;
|
||||||
private int maxStack = MAX_STACK;
|
private int maxStack = MAX_STACK;
|
||||||
|
private CraftInventory inventory = new CraftInventory(this);
|
||||||
|
|
||||||
public SpecialEnderChest(Player p, Boolean online) {
|
public SpecialEnderChest(Player p, Boolean online) {
|
||||||
super(((CraftPlayer) p).getHandle().getEnderChest().getName(),
|
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().hasCustomName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
|
||||||
((CraftPlayer) p).getHandle().getEnderChest().getSize());
|
|
||||||
CraftPlayer player = (CraftPlayer) p;
|
CraftPlayer player = (CraftPlayer) p;
|
||||||
this.enderChest = player.getHandle().getEnderChest();
|
this.enderChest = player.getHandle().getEnderChest();
|
||||||
this.owner = player;
|
this.owner = player;
|
||||||
this.items = enderChest.getContents();
|
this.items = enderChest.getContents();
|
||||||
|
OpenInv.enderChests.put(owner.getName().toLowerCase(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
public Inventory getBukkitInventory() {
|
||||||
return inventory;
|
return inventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void InventoryRemovalCheck() {
|
||||||
public void setPlayerOnline(Player player) {
|
owner.saveData();
|
||||||
|
if (transaction.isEmpty() && !playerOnline) {
|
||||||
|
OpenInv.enderChests.remove(owner.getName().toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PlayerGoOnline(Player p) {
|
||||||
if (!playerOnline) {
|
if (!playerOnline) {
|
||||||
try {
|
try {
|
||||||
owner = (CraftPlayer) player;
|
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void PlayerGoOffline() {
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
playerOnline = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack[] getContents() {
|
public ItemStack[] getContents() {
|
||||||
return this.items;
|
return this.items;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onOpen(CraftHumanEntity who) {
|
public void onOpen(CraftHumanEntity who) {
|
||||||
transaction.add(who);
|
transaction.add(who);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClose(CraftHumanEntity who) {
|
public void onClose(CraftHumanEntity who) {
|
||||||
transaction.remove(who);
|
transaction.remove(who);
|
||||||
|
this.InventoryRemovalCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<HumanEntity> getViewers() {
|
public List<HumanEntity> getViewers() {
|
||||||
return transaction;
|
return transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public InventoryHolder getOwner() {
|
public InventoryHolder getOwner() {
|
||||||
return this.owner;
|
return this.owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMaxStackSize(int size) {
|
public void setMaxStackSize(int size) {
|
||||||
maxStack = size;
|
maxStack = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxStackSize() {
|
public int getMaxStackSize() {
|
||||||
return maxStack;
|
return maxStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public boolean a(EntityHuman entityhuman) {
|
||||||
public void update() {
|
return true;
|
||||||
super.update();
|
|
||||||
enderChest.update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void startOpen() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void f() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
enderChest.update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -14,31 +14,32 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.lishid.openinv.internal.v1_4_5;
|
package com.lishid.openinv.internal.v1_8_R1;
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
|
|
||||||
// Volatile
|
import com.lishid.openinv.OpenInv;
|
||||||
import net.minecraft.server.v1_4_5.ItemStack;
|
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
||||||
import net.minecraft.server.v1_4_5.PlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
|
//Volatile
|
||||||
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
|
import net.minecraft.server.v1_8_R1.*;
|
||||||
|
import org.bukkit.craftbukkit.v1_8_R1.entity.*;
|
||||||
|
import org.bukkit.craftbukkit.v1_8_R1.inventory.*;
|
||||||
|
|
||||||
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
||||||
|
CraftPlayer owner;
|
||||||
|
public boolean playerOnline = false;
|
||||||
|
private ItemStack[] extra = new ItemStack[5];
|
||||||
|
private CraftInventory inventory = new CraftInventory(this);
|
||||||
|
|
||||||
private final ItemStack[] extra = new ItemStack[5];
|
public SpecialPlayerInventory(Player p, Boolean online) {
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
super(((CraftPlayer) p).getHandle());
|
||||||
private boolean playerOnline = false;
|
this.owner = ((CraftPlayer) p);
|
||||||
|
|
||||||
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
|
|
||||||
super(((CraftPlayer) bukkitPlayer).getHandle());
|
|
||||||
this.playerOnline = online;
|
this.playerOnline = online;
|
||||||
this.items = player.inventory.items;
|
this.items = player.inventory.items;
|
||||||
this.armor = player.inventory.armor;
|
this.armor = player.inventory.armor;
|
||||||
|
OpenInv.inventories.put(owner.getName().toLowerCase(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -47,31 +48,42 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPlayerOnline(Player player) {
|
public void InventoryRemovalCheck() {
|
||||||
|
owner.saveData();
|
||||||
|
if (transaction.isEmpty() && !playerOnline) {
|
||||||
|
OpenInv.inventories.remove(owner.getName().toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void PlayerGoOnline(Player player) {
|
||||||
if (!playerOnline) {
|
if (!playerOnline) {
|
||||||
this.player = ((CraftPlayer) player).getHandle();
|
CraftPlayer p = (CraftPlayer) player;
|
||||||
this.player.inventory.items = this.items;
|
p.getHandle().inventory.items = this.items;
|
||||||
this.player.inventory.armor = this.armor;
|
p.getHandle().inventory.armor = this.armor;
|
||||||
|
p.saveData();
|
||||||
playerOnline = true;
|
playerOnline = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPlayerOffline() {
|
public void PlayerGoOffline() {
|
||||||
playerOnline = false;
|
playerOnline = false;
|
||||||
|
this.InventoryRemovalCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInUse() {
|
public void onClose(CraftHumanEntity who) {
|
||||||
return !this.getViewers().isEmpty();
|
super.onClose(who);
|
||||||
|
this.InventoryRemovalCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack[] getContents() {
|
public ItemStack[] getContents() {
|
||||||
ItemStack[] contents = new ItemStack[getSize()];
|
ItemStack[] C = new ItemStack[getSize()];
|
||||||
System.arraycopy(items, 0, contents, 0, items.length);
|
System.arraycopy(items, 0, C, 0, items.length);
|
||||||
System.arraycopy(armor, 0, contents, items.length, armor.length);
|
System.arraycopy(items, 0, C, items.length, armor.length);
|
||||||
return contents;
|
return C;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -197,13 +209,13 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
|
|||||||
|
|
||||||
// Effects
|
// Effects
|
||||||
if (is == this.extra) {
|
if (is == this.extra) {
|
||||||
player.drop(itemstack);
|
owner.getHandle().drop(itemstack, true);
|
||||||
itemstack = null;
|
itemstack = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
is[i] = itemstack;
|
is[i] = itemstack;
|
||||||
|
|
||||||
player.defaultContainer.b();
|
owner.getHandle().defaultContainer.b();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getReversedItemSlotNum(int i) {
|
private int getReversedItemSlotNum(int i) {
|
||||||
@@ -234,4 +246,8 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
|
|||||||
return player.getName();
|
return player.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean a(EntityHuman entityhuman) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
510
src/com/lishid/openinv/utils/ReflectionUtil.java
Normal file
510
src/com/lishid/openinv/utils/ReflectionUtil.java
Normal file
@@ -0,0 +1,510 @@
|
|||||||
|
package com.lishid.openinv.utils;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
public final class ReflectionUtil {
|
||||||
|
private ReflectionUtil() {}
|
||||||
|
|
||||||
|
public static Class<?> getClass(String name, PackageType type) throws Exception {
|
||||||
|
return Class.forName(type + "." + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class<?> getClass(String name, SubPackageType type) throws Exception {
|
||||||
|
return Class.forName(type + "." + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Constructor<?> getConstructor(Class<?> clazz, Class<?>... parameterTypes) {
|
||||||
|
Class<?>[] p = DataType.convertToPrimitive(parameterTypes);
|
||||||
|
for (Constructor<?> c : clazz.getConstructors())
|
||||||
|
if (DataType.equalsArray(DataType.convertToPrimitive(c.getParameterTypes()), p))
|
||||||
|
return c;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Constructor<?> getConstructor(String className, PackageType type, Class<?>... parameterTypes) throws Exception {
|
||||||
|
return getConstructor(getClass(className, type), parameterTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Constructor<?> getConstructor(String className, SubPackageType type, Class<?>... parameterTypes) throws Exception {
|
||||||
|
return getConstructor(getClass(className, type), parameterTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object newInstance(Class<?> clazz, Object... args) throws Exception {
|
||||||
|
return getConstructor(clazz, DataType.convertToPrimitive(args)).newInstance(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object newInstance(String className, PackageType type, Object... args) throws Exception {
|
||||||
|
return newInstance(getClass(className, type), args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object newInstance(String className, SubPackageType type, Object... args) throws Exception {
|
||||||
|
return newInstance(getClass(className, type), args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Method getMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
|
||||||
|
Class<?>[] p = DataType.convertToPrimitive(parameterTypes);
|
||||||
|
for (Method m : clazz.getMethods())
|
||||||
|
if (m.getName().equals(name) && DataType.equalsArray(DataType.convertToPrimitive(m.getParameterTypes()), p))
|
||||||
|
return m;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Method getMethod(String className, PackageType type, String name, Class<?>... parameterTypes) throws Exception {
|
||||||
|
return getMethod(getClass(className, type), name, parameterTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Method getMethod(String className, SubPackageType type, String name, Class<?>... parameterTypes) throws Exception {
|
||||||
|
return getMethod(getClass(className, type), name, parameterTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object invokeMethod(String name, Object instance, Object... args) throws Exception {
|
||||||
|
return getMethod(instance.getClass(), name, DataType.convertToPrimitive(args)).invoke(instance, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object invokeMethod(Class<?> clazz, String name, Object instance, Object... args) throws Exception {
|
||||||
|
return getMethod(clazz, name, DataType.convertToPrimitive(args)).invoke(instance, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object invokeMethod(String className, PackageType type, String name, Object instance, Object... args) throws Exception {
|
||||||
|
return invokeMethod(getClass(className, type), name, instance, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object invokeMethod(String className, SubPackageType type, String name, Object instance, Object... args) throws Exception {
|
||||||
|
return invokeMethod(getClass(className, type), name, instance, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getField(Class<?> clazz, String name) throws Exception {
|
||||||
|
Field f = clazz.getField(name);
|
||||||
|
f.setAccessible(true);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getField(String className, PackageType type, String name) throws Exception {
|
||||||
|
return getField(getClass(className, type), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getField(String className, SubPackageType type, String name) throws Exception {
|
||||||
|
return getField(getClass(className, type), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getDeclaredField(Class<?> clazz, String name) throws Exception {
|
||||||
|
Field f = clazz.getDeclaredField(name);
|
||||||
|
f.setAccessible(true);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getDeclaredField(String className, PackageType type, String name) throws Exception {
|
||||||
|
return getDeclaredField(getClass(className, type), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getDeclaredField(String className, SubPackageType type, String name) throws Exception {
|
||||||
|
return getDeclaredField(getClass(className, type), name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getValue(Object instance, String fieldName) throws Exception {
|
||||||
|
return getField(instance.getClass(), fieldName).get(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getValue(Class<?> clazz, Object instance, String fieldName) throws Exception {
|
||||||
|
return getField(clazz, fieldName).get(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getValue(String className, PackageType type, Object instance, String fieldName) throws Exception {
|
||||||
|
return getValue(getClass(className, type), instance, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception {
|
||||||
|
return getValue(getClass(className, type), instance, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getDeclaredValue(Object instance, String fieldName) throws Exception {
|
||||||
|
return getDeclaredField(instance.getClass(), fieldName).get(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getDeclaredValue(Class<?> clazz, Object instance, String fieldName) throws Exception {
|
||||||
|
return getDeclaredField(clazz, fieldName).get(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getDeclaredValue(String className, PackageType type, Object instance, String fieldName) throws Exception {
|
||||||
|
return getDeclaredValue(getClass(className, type), instance, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getDeclaredValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception {
|
||||||
|
return getDeclaredValue(getClass(className, type), instance, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
Field f = getField(instance.getClass(), fieldName);
|
||||||
|
f.set(instance, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(Object instance, FieldPair pair) throws Exception {
|
||||||
|
setValue(instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(Class<?> clazz, Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
Field f = getField(clazz, fieldName);
|
||||||
|
f.set(instance, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(Class<?> clazz, Object instance, FieldPair pair) throws Exception {
|
||||||
|
setValue(clazz, instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
setValue(getClass(className, type), instance, fieldName, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception {
|
||||||
|
setValue(className, type, instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
setValue(getClass(className, type), instance, fieldName, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception {
|
||||||
|
setValue(className, type, instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValues(Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
for (FieldPair pair : pairs)
|
||||||
|
setValue(instance, pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValues(Class<?> clazz, Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
for (FieldPair pair : pairs)
|
||||||
|
setValue(clazz, instance, pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
setValues(getClass(className, type), instance, pairs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
setValues(getClass(className, type), instance, pairs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
Field f = getDeclaredField(instance.getClass(), fieldName);
|
||||||
|
f.set(instance, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(Object instance, FieldPair pair) throws Exception {
|
||||||
|
setDeclaredValue(instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(Class<?> clazz, Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
Field f = getDeclaredField(clazz, fieldName);
|
||||||
|
f.set(instance, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(Class<?> clazz, Object instance, FieldPair pair) throws Exception {
|
||||||
|
setDeclaredValue(clazz, instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception {
|
||||||
|
setDeclaredValue(className, type, instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception {
|
||||||
|
setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception {
|
||||||
|
setDeclaredValue(className, type, instance, pair.getName(), pair.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValues(Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
for (FieldPair pair : pairs)
|
||||||
|
setDeclaredValue(instance, pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValues(Class<?> clazz, Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
for (FieldPair pair : pairs)
|
||||||
|
setDeclaredValue(clazz, instance, pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
setDeclaredValues(getClass(className, type), instance, pairs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDeclaredValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception {
|
||||||
|
setDeclaredValues(getClass(className, type), instance, pairs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DataType {
|
||||||
|
BYTE(byte.class, Byte.class),
|
||||||
|
SHORT(short.class, Short.class),
|
||||||
|
INTEGER(int.class, Integer.class),
|
||||||
|
LONG(long.class, Long.class),
|
||||||
|
CHARACTER(char.class, Character.class),
|
||||||
|
FLOAT(float.class, Float.class),
|
||||||
|
DOUBLE(double.class, Double.class),
|
||||||
|
BOOLEAN(boolean.class, Boolean.class);
|
||||||
|
|
||||||
|
private static final Map<Class<?>, DataType> CLASS_MAP = new HashMap<Class<?>, DataType>();
|
||||||
|
private final Class<?> primitive;
|
||||||
|
private final Class<?> reference;
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (DataType t : values()) {
|
||||||
|
CLASS_MAP.put(t.primitive, t);
|
||||||
|
CLASS_MAP.put(t.reference, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private DataType(Class<?> primitive, Class<?> reference) {
|
||||||
|
this.primitive = primitive;
|
||||||
|
this.reference = reference;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<?> getPrimitive() {
|
||||||
|
return this.primitive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<?> getReference() {
|
||||||
|
return this.reference;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DataType fromClass(Class<?> c) {
|
||||||
|
return CLASS_MAP.get(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class<?> getPrimitive(Class<?> c) {
|
||||||
|
DataType t = fromClass(c);
|
||||||
|
return t == null ? c : t.getPrimitive();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class<?> getReference(Class<?> c) {
|
||||||
|
DataType t = fromClass(c);
|
||||||
|
return t == null ? c : t.getReference();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class<?>[] convertToPrimitive(Class<?>[] classes) {
|
||||||
|
int length = classes == null ? 0 : classes.length;
|
||||||
|
Class<?>[] types = new Class<?>[length];
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
types[i] = getPrimitive(classes[i]);
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class<?>[] convertToPrimitive(Object[] objects) {
|
||||||
|
int length = objects == null ? 0 : objects.length;
|
||||||
|
Class<?>[] types = new Class<?>[length];
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
types[i] = getPrimitive(objects[i].getClass());
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equalsArray(Class<?>[] a1, Class<?>[] a2) {
|
||||||
|
if (a1 == null || a2 == null || a1.length != a2.length)
|
||||||
|
return false;
|
||||||
|
for (int i = 0; i < a1.length; i++)
|
||||||
|
if (!a1[i].equals(a2[i]) && !a1[i].isAssignableFrom(a2[i]))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class FieldPair {
|
||||||
|
private final String name;
|
||||||
|
private final Object value;
|
||||||
|
|
||||||
|
public FieldPair(String name, Object value) {
|
||||||
|
this.name = name;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PackageType {
|
||||||
|
MINECRAFT_SERVER("net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().substring(23)),
|
||||||
|
CRAFTBUKKIT(Bukkit.getServer().getClass().getPackage().getName());
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private PackageType(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SubPackageType {
|
||||||
|
BLOCK,
|
||||||
|
CHUNKIO,
|
||||||
|
COMMAND,
|
||||||
|
CONVERSATIONS,
|
||||||
|
ENCHANTMENS,
|
||||||
|
ENTITY,
|
||||||
|
EVENT,
|
||||||
|
GENERATOR,
|
||||||
|
HELP,
|
||||||
|
INVENTORY,
|
||||||
|
MAP,
|
||||||
|
METADATA,
|
||||||
|
POTION,
|
||||||
|
PROJECTILES,
|
||||||
|
SCHEDULER,
|
||||||
|
SCOREBOARD,
|
||||||
|
UPDATER,
|
||||||
|
UTIL;
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private SubPackageType() {
|
||||||
|
name = PackageType.CRAFTBUKKIT + "." + name().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PacketType {
|
||||||
|
HANDSHAKING_IN_SET_PROTOCOL("PacketHandshakingInSetProtocol"),
|
||||||
|
LOGIN_IN_ENCRYPTION_BEGIN("PacketLoginInEncryptionBegin"),
|
||||||
|
LOGIN_IN_START("PacketLoginInStart"),
|
||||||
|
LOGIN_OUT_DISCONNECT("PacketLoginOutDisconnect"),
|
||||||
|
LOGIN_OUT_ENCRYPTION_BEGIN("PacketLoginOutEncryptionBegin"),
|
||||||
|
LOGIN_OUT_SUCCESS("PacketLoginOutSuccess"),
|
||||||
|
PLAY_IN_ABILITIES("PacketPlayInAbilities"),
|
||||||
|
PLAY_IN_ARM_ANIMATION("PacketPlayInArmAnimation"),
|
||||||
|
PLAY_IN_BLOCK_DIG("PacketPlayInBlockDig"),
|
||||||
|
PLAY_IN_BLOCK_PLACE("PacketPlayInBlockPlace"),
|
||||||
|
PLAY_IN_CHAT("PacketPlayInChat"),
|
||||||
|
PLAY_IN_CLIENT_COMMAND("PacketPlayInClientCommand"),
|
||||||
|
PLAY_IN_CLOSE_WINDOW("PacketPlayInCloseWindow"),
|
||||||
|
PLAY_IN_CUSTOM_PAYLOAD("PacketPlayInCustomPayload"),
|
||||||
|
PLAY_IN_ENCHANT_ITEM("PacketPlayInEnchantItem"),
|
||||||
|
PLAY_IN_ENTITY_ACTION("PacketPlayInEntityAction"),
|
||||||
|
PLAY_IN_FLYING("PacketPlayInFlying"),
|
||||||
|
PLAY_IN_HELD_ITEM_SLOT("PacketPlayInHeldItemSlot"),
|
||||||
|
PLAY_IN_KEEP_ALIVE("PacketPlayInKeepAlive"),
|
||||||
|
PLAY_IN_LOOK("PacketPlayInLook"),
|
||||||
|
PLAY_IN_POSITION("PacketPlayInPosition"),
|
||||||
|
PLAY_IN_POSITION_LOOK("PacketPlayInPositionLook"),
|
||||||
|
PLAY_IN_SET_CREATIVE_SLOT("PacketPlayInSetCreativeSlot "),
|
||||||
|
PLAY_IN_SETTINGS("PacketPlayInSettings"),
|
||||||
|
PLAY_IN_STEER_VEHICLE("PacketPlayInSteerVehicle"),
|
||||||
|
PLAY_IN_TAB_COMPLETE("PacketPlayInTabComplete"),
|
||||||
|
PLAY_IN_TRANSACTION("PacketPlayInTransaction"),
|
||||||
|
PLAY_IN_UPDATE_SIGN("PacketPlayInUpdateSign"),
|
||||||
|
PLAY_IN_USE_ENTITY("PacketPlayInUseEntity"),
|
||||||
|
PLAY_IN_WINDOW_CLICK("PacketPlayInWindowClick"),
|
||||||
|
PLAY_OUT_ABILITIES("PacketPlayOutAbilities"),
|
||||||
|
PLAY_OUT_ANIMATION("PacketPlayOutAnimation"),
|
||||||
|
PLAY_OUT_ATTACH_ENTITY("PacketPlayOutAttachEntity"),
|
||||||
|
PLAY_OUT_BED("PacketPlayOutBed"),
|
||||||
|
PLAY_OUT_BLOCK_ACTION("PacketPlayOutBlockAction"),
|
||||||
|
PLAY_OUT_BLOCK_BREAK_ANIMATION("PacketPlayOutBlockBreakAnimation"),
|
||||||
|
PLAY_OUT_BLOCK_CHANGE("PacketPlayOutBlockChange"),
|
||||||
|
PLAY_OUT_CHAT("PacketPlayOutChat"),
|
||||||
|
PLAY_OUT_CLOSE_WINDOW("PacketPlayOutCloseWindow"),
|
||||||
|
PLAY_OUT_COLLECT("PacketPlayOutCollect"),
|
||||||
|
PLAY_OUT_CRAFT_PROGRESS_BAR("PacketPlayOutCraftProgressBar"),
|
||||||
|
PLAY_OUT_CUSTOM_PAYLOAD("PacketPlayOutCustomPayload"),
|
||||||
|
PLAY_OUT_ENTITY("PacketPlayOutEntity"),
|
||||||
|
PLAY_OUT_ENTITY_DESTROY("PacketPlayOutEntityDestroy"),
|
||||||
|
PLAY_OUT_ENTITY_EFFECT("PacketPlayOutEntityEffect"),
|
||||||
|
PLAY_OUT_ENTITY_EQUIPMENT("PacketPlayOutEntityEquipment"),
|
||||||
|
PLAY_OUT_ENTITY_HEAD_ROTATION("PacketPlayOutEntityHeadRotation"),
|
||||||
|
PLAY_OUT_ENTITY_LOOK("PacketPlayOutEntityLook"),
|
||||||
|
PLAY_OUT_ENTITY_METADATA("PacketPlayOutEntityMetadata"),
|
||||||
|
PLAY_OUT_ENTITY_STATUS("PacketPlayOutEntityStatus"),
|
||||||
|
PLAY_OUT_ENTITY_TELEPORT("PacketPlayOutEntityTeleport"),
|
||||||
|
PLAY_OUT_ENTITY_VELOCITY("PacketPlayOutEntityVelocity"),
|
||||||
|
PLAY_OUT_EXPERIENCE("PacketPlayOutExperience"),
|
||||||
|
PLAY_OUT_EXPLOSION("PacketPlayOutExplosion"),
|
||||||
|
PLAY_OUT_GAME_STATE_CHANGE("PacketPlayOutGameStateChange"),
|
||||||
|
PLAY_OUT_HELD_ITEM_SLOT("PacketPlayOutHeldItemSlot"),
|
||||||
|
PLAY_OUT_KEEP_ALIVE("PacketPlayOutKeepAlive"),
|
||||||
|
PLAY_OUT_KICK_DISCONNECT("PacketPlayOutKickDisconnect"),
|
||||||
|
PLAY_OUT_LOGIN("PacketPlayOutLogin"),
|
||||||
|
PLAY_OUT_MAP("PacketPlayOutMap"),
|
||||||
|
PLAY_OUT_MAP_CHUNK("PacketPlayOutMapChunk"),
|
||||||
|
PLAY_OUT_MAP_CHUNK_BULK("PacketPlayOutMapChunkBulk"),
|
||||||
|
PLAY_OUT_MULTI_BLOCK_CHANGE("PacketPlayOutMultiBlockChange"),
|
||||||
|
PLAY_OUT_NAMED_ENTITY_SPAWN("PacketPlayOutNamedEntitySpawn"),
|
||||||
|
PLAY_OUT_NAMED_SOUND_EFFECT("PacketPlayOutNamedSoundEffect"),
|
||||||
|
PLAY_OUT_OPEN_SIGN_EDITOR("PacketPlayOutOpenSignEditor"),
|
||||||
|
PLAY_OUT_OPEN_WINDOW("PacketPlayOutOpenWindow"),
|
||||||
|
PLAY_OUT_PLAYER_INFO("PacketPlayOutPlayerInfo"),
|
||||||
|
PLAY_OUT_POSITION("PacketPlayOutPosition"),
|
||||||
|
PLAY_OUT_REL_ENTITY_MOVE("PacketPlayOutRelEntityMove"),
|
||||||
|
PLAY_OUT_REL_ENTITY_MOVE_LOOK("PacketPlayOutRelEntityMoveLook"),
|
||||||
|
PLAY_OUT_REMOVE_ENTITY_EFFECT("PacketPlayOutRemoveEntityEffect"),
|
||||||
|
PLAY_OUT_RESPAWN("PacketPlayOutRespawn"),
|
||||||
|
PLAY_OUT_SCOREBOARD_DISPLAY_OBJECTIVE("PacketPlayOutScoreboardDisplayObjective"),
|
||||||
|
PLAY_OUT_SCOREBOARD_OBJECTIVE("PacketPlayOutScoreboardObjective"),
|
||||||
|
PLAY_OUT_SCOREBOARD_SCORE("PacketPlayOutScoreboardScore"),
|
||||||
|
PLAY_OUT_SCOREBOARD_TEAM("PacketPlayOutScoreboardTeam"),
|
||||||
|
PLAY_OUT_SET_SLOT("PacketPlayOutSetSlot"),
|
||||||
|
PLAY_OUT_SPAWN_ENTITY("PacketPlayOutSpawnEntity"),
|
||||||
|
PLAY_OUT_SPAWN_ENTITY_EXPERIENCE_ORB("PacketPlayOutSpawnEntityExperienceOrb"),
|
||||||
|
PLAY_OUT_SPAWN_ENTITY_LIVING("PacketPlayOutSpawnEntityLiving"),
|
||||||
|
PLAY_OUT_SPAWN_ENTITY_PAINTING("PacketPlayOutSpawnEntityPainting"),
|
||||||
|
PLAY_OUT_SPAWN_ENTITY_WEATHER("PacketPlayOutSpawnEntityWeather"),
|
||||||
|
PLAY_OUT_SPAWN_POSITION("PacketPlayOutSpawnPosition"),
|
||||||
|
PLAY_OUT_STATISTIC("PacketPlayOutStatistic"),
|
||||||
|
PLAY_OUT_TAB_COMPLETE("PacketPlayOutTabComplete"),
|
||||||
|
PLAY_OUT_TILE_ENTITY_DATA("PacketPlayOutTileEntityData"),
|
||||||
|
PLAY_OUT_TRANSACTION("PacketPlayOutTransaction"),
|
||||||
|
PLAY_OUT_UPDATE_ATTRIBUTES("PacketPlayOutUpdateAttributes"),
|
||||||
|
PLAY_OUT_UPDATE_HEALTH("PacketPlayOutUpdateHealth"),
|
||||||
|
PLAY_OUT_UPDATE_SIGN("PacketPlayOutUpdateSign"),
|
||||||
|
PLAY_OUT_UPDATE_TIME("PacketPlayOutUpdateTime"),
|
||||||
|
PLAY_OUT_WINDOW_ITEMS("PacketPlayOutWindowItems"),
|
||||||
|
PLAY_OUT_WORLD_EVENT("PacketPlayOutWorldEvent"),
|
||||||
|
PLAY_OUT_WORLD_PARTICLES("PacketPlayOutWorldParticles"),
|
||||||
|
STATUS_IN_PING("PacketStatusInPing"),
|
||||||
|
STATUS_IN_START("PacketStatusInStart"),
|
||||||
|
STATUS_OUT_PONG("PacketStatusOutPong"),
|
||||||
|
STATUS_OUT_SERVER_INFO("PacketStatusOutServerInfo");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private Class<?> packet;
|
||||||
|
|
||||||
|
private PacketType(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<?> getPacket() throws Exception {
|
||||||
|
return packet == null ? packet = ReflectionUtil.getClass(name, PackageType.MINECRAFT_SERVER) : packet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
34
src/com/lishid/openinv/utils/UpdateManager.java
Normal file
34
src/com/lishid/openinv/utils/UpdateManager.java
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
package com.lishid.openinv.utils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import com.lishid.openinv.OpenInv;
|
||||||
|
import com.lishid.openinv.utils.Updater.UpdateResult;
|
||||||
|
|
||||||
|
public class UpdateManager {
|
||||||
|
public Updater updater;
|
||||||
|
|
||||||
|
public void Initialize(OpenInv plugin, File file) {
|
||||||
|
updater = new Updater(plugin, 31432, file);
|
||||||
|
|
||||||
|
// Create task to update
|
||||||
|
plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// Check for updates
|
||||||
|
if (OpenInv.GetCheckForUpdates()) {
|
||||||
|
UpdateResult result = updater.update();
|
||||||
|
if (result != UpdateResult.NO_UPDATE) {
|
||||||
|
if (result == UpdateResult.SUCCESS) {
|
||||||
|
OpenInv.log("Update found! Downloaded new version.");
|
||||||
|
OpenInv.log("This behaviour can be disabled in the config.yml");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
OpenInv.log("Update failed, reason: " + result.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 0, 20 * 60 * 1000); // Update every once a while
|
||||||
|
}
|
||||||
|
}
|
||||||
412
src/com/lishid/openinv/utils/Updater.java
Normal file
412
src/com/lishid/openinv/utils/Updater.java
Normal file
@@ -0,0 +1,412 @@
|
|||||||
|
/*
|
||||||
|
* Updater for Bukkit.
|
||||||
|
*
|
||||||
|
* This class provides the means to safely and easily update a plugin, or check to see if it is updated using dev.bukkit.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.lishid.openinv.utils;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
import org.json.simple.JSONValue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check dev.bukkit.org to find updates for a given plugin, and download the updates if needed.
|
||||||
|
* <p/>
|
||||||
|
* <b>VERY, VERY IMPORTANT</b>: Because there are no standards for adding auto-update toggles in your plugin's config, this system provides NO CHECK WITH YOUR CONFIG to make sure the user has allowed
|
||||||
|
* auto-updating. <br>
|
||||||
|
* It is a <b>BUKKIT POLICY</b> that you include a boolean value in your config that prevents the auto-updater from running <b>AT ALL</b>. <br>
|
||||||
|
* If you fail to include this option in your config, your plugin will be <b>REJECTED</b> when you attempt to submit it to dev.bukkit.org.
|
||||||
|
* <p/>
|
||||||
|
* An example of a good configuration option would be something similar to 'auto-update: true' - if this value is set to false you may NOT run the auto-updater. <br>
|
||||||
|
* If you are unsure about these rules, please read the plugin submission guidelines: http://goo.gl/8iU5l
|
||||||
|
*
|
||||||
|
* @author Gravity
|
||||||
|
* @version 2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Updater {
|
||||||
|
|
||||||
|
private Plugin plugin;
|
||||||
|
private String versionName;
|
||||||
|
private String versionLink;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private String versionType;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private String versionGameVersion;
|
||||||
|
|
||||||
|
private boolean announce; // Whether to announce file downloads
|
||||||
|
|
||||||
|
private URL url; // Connecting to RSS
|
||||||
|
private File file; // The plugin's file
|
||||||
|
|
||||||
|
private int id = 31432; // Project's Curse ID
|
||||||
|
// SEE https://dev.bukkit.org/home/servermods-apikey/
|
||||||
|
private String apiKey = null; // BukkitDev ServerMods API key
|
||||||
|
private static final String TITLE_VALUE = "name"; // Gets remote file's title
|
||||||
|
private static final String LINK_VALUE = "downloadUrl"; // Gets remote file's download link
|
||||||
|
private static final String TYPE_VALUE = "releaseType"; // Gets remote file's release type
|
||||||
|
private static final String VERSION_VALUE = "gameVersion"; // Gets remote file's build version
|
||||||
|
private static final String QUERY = "/servermods/files?projectIds="; // Path to GET
|
||||||
|
private static final String HOST = "https://api.curseforge.com"; // Slugs will be appended to this to get to the project's RSS feed
|
||||||
|
|
||||||
|
private static final String[] NO_UPDATE_TAG = { "-DEV", "-PRE", "-SNAPSHOT" }; // If the version number contains one of these, don't update.
|
||||||
|
private static final int BYTE_SIZE = 1024; // Used for downloading files
|
||||||
|
private String updateFolder;// The folder that downloads will be placed in
|
||||||
|
private Updater.UpdateResult result = Updater.UpdateResult.SUCCESS; // Used for determining the outcome of the update process
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives the dev the result of the update process. Can be obtained by called getResult().
|
||||||
|
*/
|
||||||
|
public enum UpdateResult {
|
||||||
|
/**
|
||||||
|
* The updater found an update, and has readied it to be loaded the next time the server restarts/reloads.
|
||||||
|
*/
|
||||||
|
SUCCESS,
|
||||||
|
/**
|
||||||
|
* The updater did not find an update, and nothing was downloaded.
|
||||||
|
*/
|
||||||
|
NO_UPDATE,
|
||||||
|
/**
|
||||||
|
* The server administrator has disabled the updating system
|
||||||
|
*/
|
||||||
|
DISABLED,
|
||||||
|
/**
|
||||||
|
* The updater found an update, but was unable to download it.
|
||||||
|
*/
|
||||||
|
FAIL_DOWNLOAD,
|
||||||
|
/**
|
||||||
|
* For some reason, the updater was unable to contact dev.bukkit.org to download the file.
|
||||||
|
*/
|
||||||
|
FAIL_DBO,
|
||||||
|
/**
|
||||||
|
* When running the version check, the file on DBO did not contain the a version in the format 'vVersion' such as 'v1.0'.
|
||||||
|
*/
|
||||||
|
FAIL_NOVERSION,
|
||||||
|
/**
|
||||||
|
* The id provided by the plugin running the updater was invalid and doesn't exist on DBO.
|
||||||
|
*/
|
||||||
|
FAIL_BADID,
|
||||||
|
/**
|
||||||
|
* The server administrator has improperly configured their API key in the configuration
|
||||||
|
*/
|
||||||
|
FAIL_APIKEY,
|
||||||
|
/**
|
||||||
|
* The updater found an update, but because of the UpdateType being set to NO_DOWNLOAD, it wasn't downloaded.
|
||||||
|
*/
|
||||||
|
UPDATE_AVAILABLE
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the updater
|
||||||
|
*
|
||||||
|
* @param plugin The plugin that is checking for an update.
|
||||||
|
* @param id The dev.bukkit.org id of the project
|
||||||
|
* @param file The file that the plugin is running from, get this by doing this.getFile() from within your main class.
|
||||||
|
*/
|
||||||
|
public Updater(Plugin plugin, int id, File file) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.file = file;
|
||||||
|
this.id = id;
|
||||||
|
this.updateFolder = plugin.getServer().getUpdateFolder();
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.url = new URL(Updater.HOST + Updater.QUERY + id);
|
||||||
|
}
|
||||||
|
catch (final MalformedURLException e) {
|
||||||
|
plugin.getLogger().severe("The project ID provided for updating, " + id + " is invalid.");
|
||||||
|
this.result = UpdateResult.FAIL_BADID;
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save an update from dev.bukkit.org into the server's update folder.
|
||||||
|
*/
|
||||||
|
private void saveFile(File folder, String file, String u) {
|
||||||
|
if (!folder.exists()) {
|
||||||
|
folder.mkdir();
|
||||||
|
}
|
||||||
|
BufferedInputStream in = null;
|
||||||
|
FileOutputStream fout = null;
|
||||||
|
try {
|
||||||
|
// Download the file
|
||||||
|
final URL url = new URL(u);
|
||||||
|
final int fileLength = url.openConnection().getContentLength();
|
||||||
|
in = new BufferedInputStream(url.openStream());
|
||||||
|
fout = new FileOutputStream(folder.getAbsolutePath() + "/" + file);
|
||||||
|
|
||||||
|
final byte[] data = new byte[Updater.BYTE_SIZE];
|
||||||
|
int count;
|
||||||
|
if (this.announce) {
|
||||||
|
this.plugin.getLogger().info("About to download a new update: " + this.versionName);
|
||||||
|
}
|
||||||
|
long downloaded = 0;
|
||||||
|
while ((count = in.read(data, 0, Updater.BYTE_SIZE)) != -1) {
|
||||||
|
downloaded += count;
|
||||||
|
fout.write(data, 0, count);
|
||||||
|
final int percent = (int) ((downloaded * 100) / fileLength);
|
||||||
|
if (this.announce && ((percent % 10) == 0)) {
|
||||||
|
this.plugin.getLogger().info("Downloading update: " + percent + "% of " + fileLength + " bytes.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Just a quick check to make sure we didn't leave any files from last time...
|
||||||
|
for (final File xFile : new File(this.plugin.getDataFolder().getParent(), this.updateFolder).listFiles()) {
|
||||||
|
if (xFile.getName().endsWith(".zip")) {
|
||||||
|
xFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check to see if it's a zip file, if it is, unzip it.
|
||||||
|
final File dFile = new File(folder.getAbsolutePath() + "/" + file);
|
||||||
|
if (dFile.getName().endsWith(".zip")) {
|
||||||
|
// Unzip
|
||||||
|
this.unzip(dFile.getCanonicalPath());
|
||||||
|
}
|
||||||
|
if (this.announce) {
|
||||||
|
this.plugin.getLogger().info("Finished updating.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (final Exception ex) {
|
||||||
|
this.plugin.getLogger().warning("The auto-updater tried to download a new update, but was unsuccessful.");
|
||||||
|
this.result = Updater.UpdateResult.FAIL_DOWNLOAD;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
try {
|
||||||
|
if (in != null) {
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
if (fout != null) {
|
||||||
|
fout.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (final Exception ex) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Part of Zip-File-Extractor, modified by Gravity for use with Bukkit
|
||||||
|
*/
|
||||||
|
private void unzip(String file) {
|
||||||
|
try {
|
||||||
|
final File fSourceZip = new File(file);
|
||||||
|
final String zipPath = file.substring(0, file.length() - 4);
|
||||||
|
ZipFile zipFile = new ZipFile(fSourceZip);
|
||||||
|
Enumeration<? extends ZipEntry> e = zipFile.entries();
|
||||||
|
while (e.hasMoreElements()) {
|
||||||
|
ZipEntry entry = e.nextElement();
|
||||||
|
File destinationFilePath = new File(zipPath, entry.getName());
|
||||||
|
destinationFilePath.getParentFile().mkdirs();
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
final BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
|
||||||
|
int b;
|
||||||
|
final byte buffer[] = new byte[Updater.BYTE_SIZE];
|
||||||
|
final FileOutputStream fos = new FileOutputStream(destinationFilePath);
|
||||||
|
final BufferedOutputStream bos = new BufferedOutputStream(fos, Updater.BYTE_SIZE);
|
||||||
|
while ((b = bis.read(buffer, 0, Updater.BYTE_SIZE)) != -1) {
|
||||||
|
bos.write(buffer, 0, b);
|
||||||
|
}
|
||||||
|
bos.flush();
|
||||||
|
bos.close();
|
||||||
|
bis.close();
|
||||||
|
final String name = destinationFilePath.getName();
|
||||||
|
if (name.endsWith(".jar") && this.pluginFile(name)) {
|
||||||
|
destinationFilePath.renameTo(new File(this.plugin.getDataFolder().getParent(), this.updateFolder + "/" + name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entry = null;
|
||||||
|
destinationFilePath = null;
|
||||||
|
}
|
||||||
|
e = null;
|
||||||
|
zipFile.close();
|
||||||
|
zipFile = null;
|
||||||
|
|
||||||
|
// Move any plugin data folders that were included to the right place, Bukkit won't do this for us.
|
||||||
|
for (final File dFile : new File(zipPath).listFiles()) {
|
||||||
|
if (dFile.isDirectory()) {
|
||||||
|
if (this.pluginFile(dFile.getName())) {
|
||||||
|
final File oFile = new File(this.plugin.getDataFolder().getParent(), dFile.getName()); // Get current dir
|
||||||
|
final File[] contents = oFile.listFiles(); // List of existing files in the current dir
|
||||||
|
for (final File cFile : dFile.listFiles()) // Loop through all the files in the new dir
|
||||||
|
{
|
||||||
|
boolean found = false;
|
||||||
|
for (final File xFile : contents) // Loop through contents to see if it exists
|
||||||
|
{
|
||||||
|
if (xFile.getName().equals(cFile.getName())) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
// Move the new file into the current dir
|
||||||
|
cFile.renameTo(new File(oFile.getCanonicalFile() + "/" + cFile.getName()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// This file already exists, so we don't need it anymore.
|
||||||
|
cFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dFile.delete();
|
||||||
|
}
|
||||||
|
new File(zipPath).delete();
|
||||||
|
fSourceZip.delete();
|
||||||
|
}
|
||||||
|
catch (final IOException ex) {
|
||||||
|
this.plugin.getLogger().warning("The auto-updater tried to unzip a new update file, but was unsuccessful.");
|
||||||
|
this.result = Updater.UpdateResult.FAIL_DOWNLOAD;
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
new File(file).delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the name of a jar is one of the plugins currently installed, used for extracting the correct files out of a zip.
|
||||||
|
*/
|
||||||
|
private boolean pluginFile(String name) {
|
||||||
|
for (final File file : new File("plugins").listFiles()) {
|
||||||
|
if (file.getName().equals(name)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check to see if the program should continue by evaluation whether the plugin is already updated, or shouldn't be updated
|
||||||
|
*/
|
||||||
|
private boolean versionCheck(String title) {
|
||||||
|
final String version = this.plugin.getDescription().getVersion();
|
||||||
|
if (title.split(" ").length == 2) {
|
||||||
|
final String remoteVersion = title.split(" ")[1].split(" ")[0]; // Get the newest file's version number
|
||||||
|
|
||||||
|
if (this.hasTag(version) || version.equalsIgnoreCase(remoteVersion) || !isNewer(version, remoteVersion)) {
|
||||||
|
// We already have the latest version, or this build is tagged for no-update
|
||||||
|
this.result = Updater.UpdateResult.NO_UPDATE;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.plugin.getLogger().warning("File versions should follow the format 'PluginName VERSION'");
|
||||||
|
this.result = Updater.UpdateResult.FAIL_NOVERSION;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate whether the version number is marked showing that it should not be updated by this program
|
||||||
|
*/
|
||||||
|
private boolean hasTag(String version) {
|
||||||
|
for (final String string : Updater.NO_UPDATE_TAG) {
|
||||||
|
if (version.contains(string)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean read() {
|
||||||
|
try {
|
||||||
|
final URLConnection conn = this.url.openConnection();
|
||||||
|
conn.setConnectTimeout(5000);
|
||||||
|
|
||||||
|
if (this.apiKey != null) {
|
||||||
|
conn.addRequestProperty("X-API-Key", this.apiKey);
|
||||||
|
}
|
||||||
|
conn.addRequestProperty("User-Agent", "Updater");
|
||||||
|
|
||||||
|
conn.setDoOutput(true);
|
||||||
|
|
||||||
|
final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
|
||||||
|
final String response = reader.readLine();
|
||||||
|
|
||||||
|
final JSONArray array = (JSONArray) JSONValue.parse(response);
|
||||||
|
|
||||||
|
if (array.size() == 0) {
|
||||||
|
this.plugin.getLogger().warning("The updater could not find any files for the project id " + this.id);
|
||||||
|
this.result = UpdateResult.FAIL_BADID;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.versionName = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.TITLE_VALUE);
|
||||||
|
this.versionLink = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.LINK_VALUE);
|
||||||
|
this.versionType = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.TYPE_VALUE);
|
||||||
|
this.versionGameVersion = (String) ((JSONObject) array.get(array.size() - 1)).get(Updater.VERSION_VALUE);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (final IOException e) {
|
||||||
|
if (e.getMessage().contains("HTTP response code: 403")) {
|
||||||
|
this.plugin.getLogger().warning("dev.bukkit.org rejected the API key provided in plugins/Updater/config.yml");
|
||||||
|
this.plugin.getLogger().warning("Please double-check your configuration to ensure it is correct.");
|
||||||
|
this.result = UpdateResult.FAIL_APIKEY;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.plugin.getLogger().warning("The updater could not contact curse for updating.");
|
||||||
|
this.result = UpdateResult.FAIL_DBO;
|
||||||
|
}
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isNewer(String oldVers, String newVers) {
|
||||||
|
String s1 = normalisedVersion(oldVers);
|
||||||
|
String s2 = normalisedVersion(newVers);
|
||||||
|
int cmp = s1.compareTo(s2);
|
||||||
|
return cmp < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String normalisedVersion(String version) {
|
||||||
|
return normalisedVersion(version, ".", 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String normalisedVersion(String version, String sep, int maxWidth) {
|
||||||
|
String[] split = Pattern.compile(sep, Pattern.LITERAL).split(version);
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (String s : split) {
|
||||||
|
sb.append(String.format("%" + maxWidth + 's', s));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public UpdateResult update() {
|
||||||
|
if (Updater.this.url != null) {
|
||||||
|
// Obtain the results of the project's file feed
|
||||||
|
if (Updater.this.read()) {
|
||||||
|
if (Updater.this.versionCheck(Updater.this.versionName)) {
|
||||||
|
if (Updater.this.versionLink != null) {
|
||||||
|
String name = Updater.this.file.getName();
|
||||||
|
// If it's a zip file, it shouldn't be downloaded as the plugin's name
|
||||||
|
if (Updater.this.versionLink.endsWith(".zip")) {
|
||||||
|
final String[] split = Updater.this.versionLink.split("/");
|
||||||
|
name = split[split.length - 1];
|
||||||
|
}
|
||||||
|
Updater.this.saveFile(new File(Updater.this.plugin.getDataFolder().getParent(), Updater.this.updateFolder), name, Updater.this.versionLink);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.result;
|
||||||
|
}
|
||||||
|
}
|
||||||
38
src/plugin.yml
Normal file
38
src/plugin.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
name: OpenInv
|
||||||
|
main: com.lishid.openinv.OpenInv
|
||||||
|
version: 2.2.5
|
||||||
|
author: lishid
|
||||||
|
description: >
|
||||||
|
This plugin allows you to open a player's inventory as a chest and interact with it in real time.
|
||||||
|
commands:
|
||||||
|
openinv:
|
||||||
|
aliases: [oi, inv, open]
|
||||||
|
description: Open a player's inventory
|
||||||
|
usage: |
|
||||||
|
/<command> - Open last person's inventory
|
||||||
|
/<command> <Player> - Open a player's inventory
|
||||||
|
openender:
|
||||||
|
aliases: [oe]
|
||||||
|
description: Opens the enderchest of a player
|
||||||
|
usage: |
|
||||||
|
/<command> <Player> - Opens a player's enderchest
|
||||||
|
searchinv:
|
||||||
|
aliases: [si]
|
||||||
|
description: Search and list players having a specific item
|
||||||
|
usage: |
|
||||||
|
/<command> <Item> [MinAmount] - Item can be the Item ID or the CraftBukkit Item Name, MinAmount is the minimum amount to be considered.
|
||||||
|
toggleopeninv:
|
||||||
|
aliases: [toi, toggleoi, toggleinv]
|
||||||
|
description: Toggle item openinv function
|
||||||
|
usage: |
|
||||||
|
/<command> [Check] - Checks whether item openinv is enabled
|
||||||
|
silentchest:
|
||||||
|
aliases: [sc, silent]
|
||||||
|
description: Toggle silent chest function, which hides the animation of a chest when opened or closed, and suppresses the sound.
|
||||||
|
usage: |
|
||||||
|
/<command> [Check] - Checks whether silent chest is enabled
|
||||||
|
anychest:
|
||||||
|
aliases: [ac]
|
||||||
|
description: Toggle anychest function, which allows opening of blocked chests.
|
||||||
|
usage: |
|
||||||
|
/<command> [Check] - Checks whether anychest is enabled
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_10_R1</artifactId>
|
|
||||||
<name>OpenInvAdapter1_10_R1</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.spigotmc</groupId>
|
|
||||||
<artifactId>spigot</artifactId>
|
|
||||||
<version>1.10-R0.1-SNAPSHOT</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,206 +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.v1_10_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_10_R1.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_10_R1.Block;
|
|
||||||
import net.minecraft.server.v1_10_R1.BlockChest;
|
|
||||||
import net.minecraft.server.v1_10_R1.BlockChest.Type;
|
|
||||||
import net.minecraft.server.v1_10_R1.BlockEnderChest;
|
|
||||||
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.EnumDirection;
|
|
||||||
import net.minecraft.server.v1_10_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_10_R1.ITileInventory;
|
|
||||||
import net.minecraft.server.v1_10_R1.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_10_R1.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_10_R1.PacketPlayOutOpenWindow;
|
|
||||||
import net.minecraft.server.v1_10_R1.StatisticList;
|
|
||||||
import net.minecraft.server.v1_10_R1.TileEntity;
|
|
||||||
import net.minecraft.server.v1_10_R1.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_10_R1.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_10_R1.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
return block.getType() == Material.ENDER_CHEST || block.getState() instanceof org.bukkit.block.Chest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) {
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ());
|
|
||||||
Block block = world.getType(blockPosition).getBlock();
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.getType(blockPosition.up()).m();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if chest is blocked or has an ocelot on top
|
|
||||||
if (isBlockedChest(world, blockPosition)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for matching adjacent chests that are blocked or have an ocelot on top
|
|
||||||
for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
|
|
||||||
BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection);
|
|
||||||
Block localBlock = world.getType(localBlockPosition).getBlock();
|
|
||||||
|
|
||||||
if (localBlock != block) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TileEntity localTileEntity = world.getTileEntity(localBlockPosition);
|
|
||||||
if (!(localTileEntity instanceof TileEntityChest)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isBlockedChest(world, localBlockPosition)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, BlockPosition blockPosition) {
|
|
||||||
// For reference, loot at net.minecraft.server.BlockChest
|
|
||||||
return world.getType(blockPosition.up()).l() || hasOcelotOnTop(world, blockPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, BlockPosition blockPosition) {
|
|
||||||
for (Entity localEntity : world.a(EntityOcelot.class,
|
|
||||||
new AxisAlignedBB(blockPosition.getX(), blockPosition.getY() + 1,
|
|
||||||
blockPosition.getZ(), blockPosition.getX() + 1, blockPosition.getY() + 2,
|
|
||||||
blockPosition.getZ() + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is pretty much API-only
|
|
||||||
if (silentchest && b.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
player.b(StatisticList.X);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
World world = player.world;
|
|
||||||
BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ());
|
|
||||||
Object tile = world.getTileEntity(blockPosition);
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
player.b(StatisticList.X);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Block block = world.getType(blockPosition).getBlock();
|
|
||||||
|
|
||||||
if (block instanceof BlockChest) {
|
|
||||||
for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
|
|
||||||
BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection);
|
|
||||||
Block localBlock = world.getType(localBlockPosition).getBlock();
|
|
||||||
|
|
||||||
if (localBlock != block) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TileEntity localTileEntity = world.getTileEntity(localBlockPosition);
|
|
||||||
if (!(localTileEntity instanceof TileEntityChest)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((localEnumDirection == EnumDirection.WEST) || (localEnumDirection == EnumDirection.NORTH)) {
|
|
||||||
tile = new InventoryLargeChest("container.chestDouble",
|
|
||||||
(TileEntityChest) localTileEntity, (ITileInventory) tile);
|
|
||||||
} else {
|
|
||||||
tile = new InventoryLargeChest("container.chestDouble",
|
|
||||||
(ITileInventory) tile, (TileEntityChest) localTileEntity);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (silentchest) {
|
|
||||||
tile = new SilentContainerChest(player.inventory, ((IInventory) tile), player);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((BlockChest) block).g == Type.BASIC)
|
|
||||||
player.b(StatisticList.ac);
|
|
||||||
else if (((BlockChest) block).g == Type.TRAP) {
|
|
||||||
player.b(StatisticList.W);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
if (!silentchest) {
|
|
||||||
player.openContainer((IInventory) tile);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) tile), player);
|
|
||||||
int windowId = player.nextContainerCounter();
|
|
||||||
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) tile).getScoreboardDisplayName(), ((IInventory) tile).getSize()));
|
|
||||||
player.activeContainer = silentContainerChest;
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_10_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// 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 isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,64 +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.v1_10_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import com.mojang.authlib.GameProfile;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// 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 implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a profile and entity to load the player data
|
|
||||||
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getUniqueId().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,46 +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.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.ItemStack;
|
|
||||||
import net.minecraft.server.v1_10_R1.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest {
|
|
||||||
|
|
||||||
public SilentContainerChest(IInventory i1, IInventory i2, EntityHuman e1) {
|
|
||||||
super(i1, i2, e1);
|
|
||||||
// Send close signal
|
|
||||||
i2.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) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(null);
|
|
||||||
entityHuman.drop(carried, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,105 +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.v1_10_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
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.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
|
|
||||||
|
|
||||||
private final InventoryEnderChest enderChest;
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialEnderChest(Player player, Boolean online) {
|
|
||||||
super(((CraftPlayer) player).getHandle().getEnderChest().getName(),
|
|
||||||
((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(),
|
|
||||||
((CraftPlayer) player).getHandle().getEnderChest().getSize());
|
|
||||||
CraftPlayer craftPlayer = (CraftPlayer) player;
|
|
||||||
this.enderChest = craftPlayer.getHandle().getEnderChest();
|
|
||||||
this.bukkitOwner = craftPlayer;
|
|
||||||
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 void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
try {
|
|
||||||
this.bukkitOwner = player;
|
|
||||||
CraftPlayer craftPlayer = (CraftPlayer) player;
|
|
||||||
setItemArrays(craftPlayer.getHandle().getEnderChest(), this.items);
|
|
||||||
} catch (Exception e) {}
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update() {
|
|
||||||
super.update();
|
|
||||||
enderChest.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,296 +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.v1_10_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// 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.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
|
||||||
|
|
||||||
private final ItemStack[] extra = new ItemStack[4];
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
|
|
||||||
super(((CraftPlayer) bukkitPlayer).getHandle());
|
|
||||||
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 void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
this.player = ((CraftPlayer) player).getHandle();
|
|
||||||
setItemArrays(this.player.inventory, items, armor, extraSlots);
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack[] getContents() {
|
|
||||||
ItemStack[] contents = new ItemStack[getSize()];
|
|
||||||
System.arraycopy(items, 0, contents, 0, items.length);
|
|
||||||
System.arraycopy(armor, 0, contents, items.length, armor.length);
|
|
||||||
System.arraycopy(extraSlots, 0, contents, items.length + armor.length, extraSlots.length);
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSize() {
|
|
||||||
return super.getSize() + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
player.drop(itemstack, true);
|
|
||||||
itemstack = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
is[i] = itemstack;
|
|
||||||
|
|
||||||
player.defaultContainer.b();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getReversedItemSlotNum(int i) {
|
|
||||||
if (i >= 27) {
|
|
||||||
return i - 27;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_11_R1</artifactId>
|
|
||||||
<name>OpenInvAdapter1_11_R1</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.spigotmc</groupId>
|
|
||||||
<artifactId>spigot</artifactId>
|
|
||||||
<version>1.11-R0.1-SNAPSHOT</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,276 +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.v1_11_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.BlockState;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_11_R1.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_11_R1.Block;
|
|
||||||
import net.minecraft.server.v1_11_R1.BlockChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.BlockChest.Type;
|
|
||||||
import net.minecraft.server.v1_11_R1.BlockEnderChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.BlockPosition;
|
|
||||||
import net.minecraft.server.v1_11_R1.BlockShulkerBox;
|
|
||||||
import net.minecraft.server.v1_11_R1.Container;
|
|
||||||
import net.minecraft.server.v1_11_R1.Entity;
|
|
||||||
import net.minecraft.server.v1_11_R1.EntityOcelot;
|
|
||||||
import net.minecraft.server.v1_11_R1.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_11_R1.EnumDirection;
|
|
||||||
import net.minecraft.server.v1_11_R1.IBlockData;
|
|
||||||
import net.minecraft.server.v1_11_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_11_R1.ITileInventory;
|
|
||||||
import net.minecraft.server.v1_11_R1.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.PacketPlayOutOpenWindow;
|
|
||||||
import net.minecraft.server.v1_11_R1.StatisticList;
|
|
||||||
import net.minecraft.server.v1_11_R1.TileEntity;
|
|
||||||
import net.minecraft.server.v1_11_R1.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.TileEntityShulkerBox;
|
|
||||||
import net.minecraft.server.v1_11_R1.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
if (block.getType() == Material.ENDER_CHEST) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
BlockState state = block.getState();
|
|
||||||
return state instanceof org.bukkit.block.Chest || state instanceof org.bukkit.block.ShulkerBox;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) {
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ());
|
|
||||||
Block block = world.getType(blockPosition).getBlock();
|
|
||||||
|
|
||||||
if (block instanceof BlockShulkerBox) {
|
|
||||||
return isBlockedShulkerBox(world, blockPosition, block);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.getType(blockPosition.up()).m();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if chest is blocked or has an ocelot on top
|
|
||||||
if (isBlockedChest(world, blockPosition)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for matching adjacent chests that are blocked or have an ocelot on top
|
|
||||||
for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
|
|
||||||
BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection);
|
|
||||||
Block localBlock = world.getType(localBlockPosition).getBlock();
|
|
||||||
|
|
||||||
if (localBlock != block) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TileEntity localTileEntity = world.getTileEntity(localBlockPosition);
|
|
||||||
if (!(localTileEntity instanceof TileEntityChest)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isBlockedChest(world, localBlockPosition)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedShulkerBox(World world, BlockPosition blockPosition, Block block) {
|
|
||||||
// For reference, look at net.minecraft.server.BlockShulkerBox
|
|
||||||
TileEntity tile = world.getTileEntity(blockPosition);
|
|
||||||
|
|
||||||
if (!(tile instanceof TileEntityShulkerBox)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
IBlockData iBlockData = block.getBlockData();
|
|
||||||
|
|
||||||
EnumDirection enumDirection = iBlockData.get(BlockShulkerBox.a);
|
|
||||||
if (((TileEntityShulkerBox) tile).p() == TileEntityShulkerBox.AnimationPhase.CLOSED) {
|
|
||||||
AxisAlignedBB axisAlignedBB = BlockShulkerBox.j.b(0.5F * enumDirection.getAdjacentX(),
|
|
||||||
0.5F * enumDirection.getAdjacentY(), 0.5F * enumDirection.getAdjacentZ())
|
|
||||||
.a(enumDirection.getAdjacentX(), enumDirection.getAdjacentY(),
|
|
||||||
enumDirection.getAdjacentZ());
|
|
||||||
|
|
||||||
return world.b(axisAlignedBB.a(blockPosition.shift(enumDirection)));
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, BlockPosition blockPosition) {
|
|
||||||
// For reference, loot at net.minecraft.server.BlockChest
|
|
||||||
return world.getType(blockPosition.up()).m() || hasOcelotOnTop(world, blockPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, BlockPosition blockPosition) {
|
|
||||||
for (Entity localEntity : world.a(EntityOcelot.class,
|
|
||||||
new AxisAlignedBB(blockPosition.getX(), blockPosition.getY() + 1,
|
|
||||||
blockPosition.getZ(), blockPosition.getX() + 1, blockPosition.getY() + 2,
|
|
||||||
blockPosition.getZ() + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is pretty much API-only
|
|
||||||
if (silentchest && b.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
player.b(StatisticList.X);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
final World world = player.world;
|
|
||||||
final BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ());
|
|
||||||
Object tile = world.getTileEntity(blockPosition);
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
player.b(StatisticList.X);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Block block = world.getType(blockPosition).getBlock();
|
|
||||||
Container container = null;
|
|
||||||
|
|
||||||
if (block instanceof BlockChest) {
|
|
||||||
BlockChest blockChest = (BlockChest) block;
|
|
||||||
|
|
||||||
for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
|
|
||||||
BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection);
|
|
||||||
Block localBlock = world.getType(localBlockPosition).getBlock();
|
|
||||||
|
|
||||||
if (localBlock != block) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TileEntity localTileEntity = world.getTileEntity(localBlockPosition);
|
|
||||||
if (!(localTileEntity instanceof TileEntityChest)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((localEnumDirection == EnumDirection.WEST) || (localEnumDirection == EnumDirection.NORTH)) {
|
|
||||||
tile = new InventoryLargeChest("container.chestDouble",
|
|
||||||
(TileEntityChest) localTileEntity, (ITileInventory) tile);
|
|
||||||
} else {
|
|
||||||
tile = new InventoryLargeChest("container.chestDouble",
|
|
||||||
(ITileInventory) tile, (TileEntityChest) localTileEntity);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blockChest.g == Type.BASIC)
|
|
||||||
player.b(StatisticList.ac);
|
|
||||||
else if (blockChest.g == Type.TRAP) {
|
|
||||||
player.b(StatisticList.W);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (silentchest) {
|
|
||||||
container = new SilentContainerChest(player.inventory, ((IInventory) tile), player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (block instanceof BlockShulkerBox) {
|
|
||||||
player.b(StatisticList.ae);
|
|
||||||
|
|
||||||
if (silentchest && tile instanceof TileEntityShulkerBox) {
|
|
||||||
// Set value to current + 1. Ensures consistency later when resetting.
|
|
||||||
SilentContainerShulkerBox.setOpenValue((TileEntityShulkerBox) tile,
|
|
||||||
SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tile) + 1);
|
|
||||||
|
|
||||||
container = new SilentContainerShulkerBox(player.inventory, (IInventory) tile, player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
final IInventory iInventory = (IInventory) tile;
|
|
||||||
|
|
||||||
if (!silentchest || container == null) {
|
|
||||||
player.openContainer(iInventory);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int windowId = player.nextContainerCounter();
|
|
||||||
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, iInventory.getName(), iInventory.getScoreboardDisplayName(), iInventory.getSize()));
|
|
||||||
player.activeContainer = container;
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
if (tile instanceof TileEntityShulkerBox) {
|
|
||||||
new BukkitRunnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// TODO hacky
|
|
||||||
Object tile = world.getTileEntity(blockPosition);
|
|
||||||
if (!(tile instanceof TileEntityShulkerBox)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TileEntityShulkerBox box = (TileEntityShulkerBox) tile;
|
|
||||||
// Reset back - we added 1, and calling TileEntityShulkerBox#startOpen adds 1 more.
|
|
||||||
SilentContainerShulkerBox.setOpenValue(box,
|
|
||||||
SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tile) - 2);
|
|
||||||
}
|
|
||||||
}.runTaskLater(Bukkit.getPluginManager().getPlugin("OpenInv"), 2);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_11_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_11_R1.IInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class InventoryAccess implements IInventoryAccess {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,64 +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.v1_11_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import com.mojang.authlib.GameProfile;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_11_R1.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_11_R1.MinecraftServer;
|
|
||||||
import net.minecraft.server.v1_11_R1.PlayerInteractManager;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
|
|
||||||
|
|
||||||
public class PlayerDataManager implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a profile and entity to load the player data
|
|
||||||
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getUniqueId().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,47 +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.v1_11_R1;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_11_R1.ContainerChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_11_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_11_R1.ItemStack;
|
|
||||||
import net.minecraft.server.v1_11_R1.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest {
|
|
||||||
|
|
||||||
public SilentContainerChest(PlayerInventory playerInventory, IInventory iInventory,
|
|
||||||
EntityHuman entityHuman) {
|
|
||||||
super(playerInventory, iInventory, entityHuman);
|
|
||||||
// Send close signal
|
|
||||||
iInventory.closeContainer(entityHuman);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void b(EntityHuman entityHuman) {
|
|
||||||
// Don't send close signal twice, might screw up
|
|
||||||
PlayerInventory playerinventory = entityHuman.inventory;
|
|
||||||
|
|
||||||
if (playerinventory.getCarried() != ItemStack.a) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(ItemStack.a);
|
|
||||||
entityHuman.drop(carried, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
package com.lishid.openinv.internal.v1_11_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import net.minecraft.server.v1_11_R1.ContainerShulkerBox;
|
|
||||||
import net.minecraft.server.v1_11_R1.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_11_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_11_R1.ItemStack;
|
|
||||||
import net.minecraft.server.v1_11_R1.PlayerInventory;
|
|
||||||
import net.minecraft.server.v1_11_R1.TileEntityShulkerBox;
|
|
||||||
|
|
||||||
public class SilentContainerShulkerBox extends ContainerShulkerBox {
|
|
||||||
|
|
||||||
private static Field fieldShulkerActionData;
|
|
||||||
|
|
||||||
public SilentContainerShulkerBox(PlayerInventory playerInventory, IInventory iInventory,
|
|
||||||
EntityHuman entityHuman) {
|
|
||||||
super(playerInventory, iInventory, entityHuman);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void b(EntityHuman entityHuman) {
|
|
||||||
PlayerInventory playerinventory = entityHuman.inventory;
|
|
||||||
|
|
||||||
if (!playerinventory.getCarried().isEmpty()) {
|
|
||||||
entityHuman.drop(playerinventory.getCarried(), false);
|
|
||||||
playerinventory.setCarried(ItemStack.a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Field exposeOpenStatus() throws NoSuchFieldException, SecurityException {
|
|
||||||
if (fieldShulkerActionData == null) {
|
|
||||||
fieldShulkerActionData = TileEntityShulkerBox.class.getDeclaredField("h");
|
|
||||||
fieldShulkerActionData.setAccessible(true);
|
|
||||||
}
|
|
||||||
return fieldShulkerActionData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setOpenValue(TileEntityShulkerBox tileShulkerBox, Object value) {
|
|
||||||
try {
|
|
||||||
exposeOpenStatus().set(tileShulkerBox, value);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer getOpenValue(TileEntityShulkerBox tileShulkerBox) {
|
|
||||||
try {
|
|
||||||
return (Integer) exposeOpenStatus().get(tileShulkerBox);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,106 +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.v1_11_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_11_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_11_R1.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_11_R1.InventorySubcontainer;
|
|
||||||
import net.minecraft.server.v1_11_R1.ItemStack;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
|
|
||||||
|
|
||||||
private final InventoryEnderChest enderChest;
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialEnderChest(Player player, Boolean online) {
|
|
||||||
super(((CraftPlayer) player).getHandle().getEnderChest().getName(),
|
|
||||||
((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(),
|
|
||||||
((CraftPlayer) player).getHandle().getEnderChest().getSize());
|
|
||||||
CraftPlayer craftPlayer = (CraftPlayer) player;
|
|
||||||
this.enderChest = craftPlayer.getHandle().getEnderChest();
|
|
||||||
this.bukkitOwner = craftPlayer;
|
|
||||||
setItemLists(this, enderChest.getContents());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setItemLists(InventorySubcontainer subcontainer, List<ItemStack> list) {
|
|
||||||
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, list);
|
|
||||||
} 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 void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
try {
|
|
||||||
this.bukkitOwner = player;
|
|
||||||
CraftPlayer craftPlayer = (CraftPlayer) player;
|
|
||||||
setItemLists(craftPlayer.getHandle().getEnderChest(), this.items);
|
|
||||||
} catch (Exception e) {}
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update() {
|
|
||||||
super.update();
|
|
||||||
enderChest.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,261 +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.v1_11_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
import net.minecraft.server.v1_11_R1.ContainerUtil;
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_11_R1.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_11_R1.ItemStack;
|
|
||||||
import net.minecraft.server.v1_11_R1.NonNullList;
|
|
||||||
import net.minecraft.server.v1_11_R1.PlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
|
||||||
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
|
|
||||||
super(((CraftPlayer) bukkitPlayer).getHandle());
|
|
||||||
this.playerOnline = online;
|
|
||||||
setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setItemArrays(PlayerInventory inventory, NonNullList<ItemStack> items,
|
|
||||||
NonNullList<ItemStack> armor, NonNullList<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, Arrays.asList(new NonNullList[] { 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 void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
this.player = ((CraftPlayer) player).getHandle();
|
|
||||||
setItemArrays(this.player.inventory, items, armor, extraSlots);
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSize() {
|
|
||||||
return super.getSize() + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack getItem(int i) {
|
|
||||||
NonNullList<ItemStack> list = this.items;
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.armor;
|
|
||||||
} else {
|
|
||||||
i = getReversedItemSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.extraSlots;
|
|
||||||
} else if (list == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
return ItemStack.a;
|
|
||||||
}
|
|
||||||
|
|
||||||
return list.get(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack splitStack(int i, int j) {
|
|
||||||
NonNullList<ItemStack> list = this.items;
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.armor;
|
|
||||||
} else {
|
|
||||||
i = getReversedItemSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.extraSlots;
|
|
||||||
} else if (list == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
return ItemStack.a;
|
|
||||||
}
|
|
||||||
|
|
||||||
return list == null || list.get(i).isEmpty() ? ItemStack.a : ContainerUtil.a(list, i, j);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack splitWithoutUpdate(int i) {
|
|
||||||
NonNullList<ItemStack> list = this.items;
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.armor;
|
|
||||||
} else {
|
|
||||||
i = getReversedItemSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.extraSlots;
|
|
||||||
} else if (list == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
return ItemStack.a;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list != null && !list.get(i).isEmpty()) {
|
|
||||||
ItemStack itemstack = list.get(i);
|
|
||||||
|
|
||||||
list.set(i, ItemStack.a);
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ItemStack.a;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setItem(int i, ItemStack itemstack) {
|
|
||||||
NonNullList<ItemStack> list = this.items;
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.armor;
|
|
||||||
} else {
|
|
||||||
i = getReversedItemSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
i -= list.size();
|
|
||||||
list = this.extraSlots;
|
|
||||||
} else if (list == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= list.size()) {
|
|
||||||
player.drop(itemstack, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list != null) {
|
|
||||||
list.set(i, itemstack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getReversedItemSlotNum(int i) {
|
|
||||||
if (i >= 27) {
|
|
||||||
return i - 27;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_4_R1</artifactId>
|
|
||||||
<name>OpenInvAdapter1_4_R1</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>craftbukkit</artifactId>
|
|
||||||
<version>1.4.7-R1.0</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,168 +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.v1_4_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_R1.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_4_R1.BlockEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_R1.EntityOcelot;
|
|
||||||
import net.minecraft.server.v1_4_R1.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_4_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_R1.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_R1.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_4_R1.Packet100OpenWindow;
|
|
||||||
import net.minecraft.server.v1_4_R1.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_4_R1.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_R1.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
return block.getType() == Material.ENDER_CHEST || block.getState() instanceof org.bukkit.block.Chest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
|
|
||||||
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.t(block.getX(), block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If block or ocelot on top
|
|
||||||
if (isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
// If block next to chest is chest and has a block or ocelot on top
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() + 1);
|
|
||||||
} else if(world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() - 1);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() + 1, block.getY() + 1, block.getZ());
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() - 1, block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, int x, int y, int z) {
|
|
||||||
return world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
|
|
||||||
for (Object localEntity : world.a(EntityOcelot.class,
|
|
||||||
AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is API-only
|
|
||||||
if (silentchest && block.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
World world = player.world;
|
|
||||||
Object tile = world.getTileEntity(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
|
|
||||||
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
if (!silentchest) {
|
|
||||||
player.openContainer((IInventory) tile);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int windowId = 0;
|
|
||||||
try {
|
|
||||||
Field windowID = player.getClass().getDeclaredField("containerCounter");
|
|
||||||
windowID.setAccessible(true);
|
|
||||||
windowId = windowID.getInt(player);
|
|
||||||
windowId = windowId % 100 + 1;
|
|
||||||
windowID.setInt(player, windowId);
|
|
||||||
} catch (NoSuchFieldException e) {}
|
|
||||||
|
|
||||||
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize()));
|
|
||||||
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_4_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_R1.IInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class InventoryAccess implements IInventoryAccess {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,63 +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.v1_4_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import net.minecraft.server.v1_4_R1.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_4_R1.MinecraftServer;
|
|
||||||
import net.minecraft.server.v1_4_R1.PlayerInteractManager;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.CraftServer;
|
|
||||||
|
|
||||||
|
|
||||||
public class PlayerDataManager implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure the player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
|
|
||||||
// Create an entity to load the player data
|
|
||||||
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), offline.getName(),
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,46 +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.v1_4_R1;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_R1.ContainerChest;
|
|
||||||
import net.minecraft.server.v1_4_R1.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_4_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_R1.ItemStack;
|
|
||||||
import net.minecraft.server.v1_4_R1.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest {
|
|
||||||
|
|
||||||
public SilentContainerChest(IInventory i1, IInventory i2) {
|
|
||||||
super(i1, i2);
|
|
||||||
// Send close signal
|
|
||||||
i2.f();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void b(EntityHuman entityHuman) {
|
|
||||||
// Don't send close signal twice, might screw up
|
|
||||||
PlayerInventory playerinventory = entityHuman.inventory;
|
|
||||||
|
|
||||||
if (playerinventory.getCarried() != null) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(null);
|
|
||||||
entityHuman.drop(carried);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,128 +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.v1_4_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_4_R1.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_4_R1.InventorySubcontainer;
|
|
||||||
import net.minecraft.server.v1_4_R1.ItemStack;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftHumanEntity;
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
|
|
||||||
|
|
||||||
private final InventoryEnderChest enderChest;
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private final List<HumanEntity> transaction = new ArrayList<HumanEntity>();
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
private CraftPlayer owner;
|
|
||||||
private int maxStack = MAX_STACK;
|
|
||||||
|
|
||||||
public SpecialEnderChest(Player p, Boolean online) {
|
|
||||||
super(((CraftPlayer) p).getHandle().getEnderChest().getName(),
|
|
||||||
((CraftPlayer) p).getHandle().getEnderChest().getSize());
|
|
||||||
CraftPlayer player = (CraftPlayer) p;
|
|
||||||
this.enderChest = player.getHandle().getEnderChest();
|
|
||||||
this.owner = player;
|
|
||||||
this.items = enderChest.getContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void update() {
|
|
||||||
super.update();
|
|
||||||
enderChest.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,237 +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.v1_4_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_4_R1.ItemStack;
|
|
||||||
import net.minecraft.server.v1_4_R1.PlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
|
||||||
|
|
||||||
private final ItemStack[] extra = new ItemStack[5];
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
|
|
||||||
super(((CraftPlayer) bukkitPlayer).getHandle());
|
|
||||||
this.playerOnline = online;
|
|
||||||
this.items = player.inventory.items;
|
|
||||||
this.armor = player.inventory.armor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
this.player = ((CraftPlayer) player).getHandle();
|
|
||||||
this.player.inventory.items = this.items;
|
|
||||||
this.player.inventory.armor = this.armor;
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack[] getContents() {
|
|
||||||
ItemStack[] contents = new ItemStack[getSize()];
|
|
||||||
System.arraycopy(items, 0, contents, 0, items.length);
|
|
||||||
System.arraycopy(armor, 0, contents, items.length, armor.length);
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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.extra;
|
|
||||||
}
|
|
||||||
else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
}
|
|
||||||
else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is[i] != null) {
|
|
||||||
ItemStack itemstack;
|
|
||||||
|
|
||||||
if (is[i].count <= j) {
|
|
||||||
itemstack = is[i];
|
|
||||||
is[i] = null;
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
itemstack = is[i].a(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.extra;
|
|
||||||
}
|
|
||||||
else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
}
|
|
||||||
else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Effects
|
|
||||||
if (is == this.extra) {
|
|
||||||
player.drop(itemstack);
|
|
||||||
itemstack = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
is[i] = itemstack;
|
|
||||||
|
|
||||||
player.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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_5_R2</artifactId>
|
|
||||||
<name>OpenInvAdapter1_5_R2</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>craftbukkit</artifactId>
|
|
||||||
<version>1.5.1-R0.2</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,168 +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.v1_5_R2;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R2.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_5_R2.BlockEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R2.EntityOcelot;
|
|
||||||
import net.minecraft.server.v1_5_R2.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_5_R2.IInventory;
|
|
||||||
import net.minecraft.server.v1_5_R2.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R2.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_5_R2.Packet100OpenWindow;
|
|
||||||
import net.minecraft.server.v1_5_R2.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_5_R2.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R2.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
return block.getType() == Material.ENDER_CHEST || block.getState() instanceof org.bukkit.block.Chest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
|
|
||||||
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.t(block.getX(), block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If block or ocelot on top
|
|
||||||
if (isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
// If block next to chest is chest and has a block or ocelot on top
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() + 1);
|
|
||||||
} else if(world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() - 1);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() + 1, block.getY() + 1, block.getZ());
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() - 1, block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, int x, int y, int z) {
|
|
||||||
return world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
|
|
||||||
for (Object localEntity : world.a(EntityOcelot.class,
|
|
||||||
AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is API-only
|
|
||||||
if (silentchest && block.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
World world = player.world;
|
|
||||||
Object tile = world.getTileEntity(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
|
|
||||||
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
if (!silentchest) {
|
|
||||||
player.openContainer((IInventory) tile);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int windowId = 0;
|
|
||||||
try {
|
|
||||||
Field windowID = player.getClass().getDeclaredField("containerCounter");
|
|
||||||
windowID.setAccessible(true);
|
|
||||||
windowId = windowID.getInt(player);
|
|
||||||
windowId = windowId % 100 + 1;
|
|
||||||
windowID.setInt(player, windowId);
|
|
||||||
} catch (NoSuchFieldException e) {}
|
|
||||||
|
|
||||||
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
|
|
||||||
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_5_R2;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R2.IInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class InventoryAccess implements IInventoryAccess {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,62 +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.v1_5_R2;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R2.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_5_R2.MinecraftServer;
|
|
||||||
import net.minecraft.server.v1_5_R2.PlayerInteractManager;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.CraftServer;
|
|
||||||
|
|
||||||
public class PlayerDataManager implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure the player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
|
|
||||||
// Create an entity to load the player data
|
|
||||||
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), offline.getName(),
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,46 +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.v1_5_R2;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R2.ContainerChest;
|
|
||||||
import net.minecraft.server.v1_5_R2.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_5_R2.IInventory;
|
|
||||||
import net.minecraft.server.v1_5_R2.ItemStack;
|
|
||||||
import net.minecraft.server.v1_5_R2.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest {
|
|
||||||
|
|
||||||
public SilentContainerChest(IInventory i1, IInventory i2) {
|
|
||||||
super(i1, i2);
|
|
||||||
// Send close signal
|
|
||||||
i2.g();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void b(EntityHuman entityHuman) {
|
|
||||||
// Don't send close signal twice, might screw up
|
|
||||||
PlayerInventory playerinventory = entityHuman.inventory;
|
|
||||||
|
|
||||||
if (playerinventory.getCarried() != null) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(null);
|
|
||||||
entityHuman.drop(carried);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,129 +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.v1_5_R2;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R2.IInventory;
|
|
||||||
import net.minecraft.server.v1_5_R2.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R2.InventorySubcontainer;
|
|
||||||
import net.minecraft.server.v1_5_R2.ItemStack;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftHumanEntity;
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
|
|
||||||
|
|
||||||
private final InventoryEnderChest enderChest;
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private final List<HumanEntity> transaction = new ArrayList<HumanEntity>();
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
private CraftPlayer owner;
|
|
||||||
private int maxStack = MAX_STACK;
|
|
||||||
|
|
||||||
public SpecialEnderChest(Player p, Boolean online) {
|
|
||||||
super(((CraftPlayer) p).getHandle().getEnderChest().getName(),
|
|
||||||
((CraftPlayer) p).getHandle().getEnderChest().c(),
|
|
||||||
((CraftPlayer) p).getHandle().getEnderChest().getSize());
|
|
||||||
CraftPlayer player = (CraftPlayer) p;
|
|
||||||
this.enderChest = player.getHandle().getEnderChest();
|
|
||||||
this.owner = player;
|
|
||||||
this.items = enderChest.getContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void update() {
|
|
||||||
super.update();
|
|
||||||
enderChest.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,229 +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.v1_5_R2;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R2.ItemStack;
|
|
||||||
import net.minecraft.server.v1_5_R2.PlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
|
||||||
|
|
||||||
private final ItemStack[] extra = new ItemStack[5];
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
|
|
||||||
super(((CraftPlayer) bukkitPlayer).getHandle());
|
|
||||||
this.playerOnline = online;
|
|
||||||
this.items = player.inventory.items;
|
|
||||||
this.armor = player.inventory.armor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
this.player = ((CraftPlayer) player).getHandle();
|
|
||||||
this.player.inventory.items = this.items;
|
|
||||||
this.player.inventory.armor = this.armor;
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack[] getContents() {
|
|
||||||
ItemStack[] contents = new ItemStack[getSize()];
|
|
||||||
System.arraycopy(items, 0, contents, 0, items.length);
|
|
||||||
System.arraycopy(armor, 0, contents, items.length, armor.length);
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is[i] != null) {
|
|
||||||
ItemStack itemstack;
|
|
||||||
|
|
||||||
if (is[i].count <= j) {
|
|
||||||
itemstack = is[i];
|
|
||||||
is[i] = null;
|
|
||||||
return itemstack;
|
|
||||||
} else {
|
|
||||||
itemstack = is[i].a(j);
|
|
||||||
if (is[i].count == 0) {
|
|
||||||
is[i] = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is[i] != null) {
|
|
||||||
ItemStack itemstack = is[i];
|
|
||||||
|
|
||||||
is[i] = null;
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Effects
|
|
||||||
if (is == this.extra) {
|
|
||||||
player.drop(itemstack);
|
|
||||||
itemstack = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
is[i] = itemstack;
|
|
||||||
|
|
||||||
player.defaultContainer.b();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getReversedItemSlotNum(int i) {
|
|
||||||
if (i >= 27) {
|
|
||||||
return i - 27;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
if (player.getName().length() > 16) {
|
|
||||||
return player.getName().substring(0, 16);
|
|
||||||
}
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_5_R3</artifactId>
|
|
||||||
<name>OpenInvAdapter1_5_R3</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>craftbukkit</artifactId>
|
|
||||||
<version>1.5.2-R1.0</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,168 +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.v1_5_R3;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
//Volatile
|
|
||||||
import net.minecraft.server.v1_5_R3.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_5_R3.BlockEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R3.EntityOcelot;
|
|
||||||
import net.minecraft.server.v1_5_R3.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_5_R3.IInventory;
|
|
||||||
import net.minecraft.server.v1_5_R3.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R3.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_5_R3.Packet100OpenWindow;
|
|
||||||
import net.minecraft.server.v1_5_R3.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_5_R3.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R3.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
return block.getType() == Material.ENDER_CHEST || block.getState() instanceof org.bukkit.block.Chest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
|
|
||||||
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.t(block.getX(), block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If block or ocelot on top
|
|
||||||
if (isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
// If block next to chest is chest and has a block or ocelot on top
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() + 1);
|
|
||||||
} else if(world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() - 1);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() + 1, block.getY() + 1, block.getZ());
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() - 1, block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, int x, int y, int z) {
|
|
||||||
return world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
|
|
||||||
for (Object localEntity : world.a(EntityOcelot.class,
|
|
||||||
AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is API-only
|
|
||||||
if (silentchest && block.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
World world = player.world;
|
|
||||||
Object tile = world.getTileEntity(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
|
|
||||||
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
if (!silentchest) {
|
|
||||||
player.openContainer((IInventory) tile);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int windowId = 0;
|
|
||||||
try {
|
|
||||||
Field windowID = player.getClass().getDeclaredField("containerCounter");
|
|
||||||
windowID.setAccessible(true);
|
|
||||||
windowId = windowID.getInt(player);
|
|
||||||
windowId = windowId % 100 + 1;
|
|
||||||
windowID.setInt(player, windowId);
|
|
||||||
} catch (NoSuchFieldException e) {}
|
|
||||||
|
|
||||||
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
|
|
||||||
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_5_R3;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R3.IInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class InventoryAccess implements IInventoryAccess {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,62 +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.v1_5_R3;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R3.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_5_R3.MinecraftServer;
|
|
||||||
import net.minecraft.server.v1_5_R3.PlayerInteractManager;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.CraftServer;
|
|
||||||
|
|
||||||
public class PlayerDataManager implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure the player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
|
|
||||||
// Create an entity to load the player data
|
|
||||||
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), offline.getName(),
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,46 +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.v1_5_R3;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R3.ContainerChest;
|
|
||||||
import net.minecraft.server.v1_5_R3.EntityHuman;
|
|
||||||
import net.minecraft.server.v1_5_R3.IInventory;
|
|
||||||
import net.minecraft.server.v1_5_R3.ItemStack;
|
|
||||||
import net.minecraft.server.v1_5_R3.PlayerInventory;
|
|
||||||
|
|
||||||
public class SilentContainerChest extends ContainerChest { public IInventory inv;
|
|
||||||
|
|
||||||
public SilentContainerChest(IInventory i1, IInventory i2) {
|
|
||||||
super(i1, i2);
|
|
||||||
// Send close signal
|
|
||||||
i2.g();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void b(EntityHuman entityHuman) {
|
|
||||||
// Don't send close signal twice, might screw up
|
|
||||||
PlayerInventory playerinventory = entityHuman.inventory;
|
|
||||||
|
|
||||||
if (playerinventory.getCarried() != null) {
|
|
||||||
ItemStack carried = playerinventory.getCarried();
|
|
||||||
playerinventory.setCarried(null);
|
|
||||||
entityHuman.drop(carried);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,129 +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.v1_5_R3;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R3.IInventory;
|
|
||||||
import net.minecraft.server.v1_5_R3.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_5_R3.InventorySubcontainer;
|
|
||||||
import net.minecraft.server.v1_5_R3.ItemStack;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftHumanEntity;
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
|
|
||||||
|
|
||||||
private final InventoryEnderChest enderChest;
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private final List<HumanEntity> transaction = new ArrayList<HumanEntity>();
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
private CraftPlayer owner;
|
|
||||||
private int maxStack = MAX_STACK;
|
|
||||||
|
|
||||||
public SpecialEnderChest(Player p, Boolean online) {
|
|
||||||
super(((CraftPlayer) p).getHandle().getEnderChest().getName(),
|
|
||||||
((CraftPlayer) p).getHandle().getEnderChest().c(),
|
|
||||||
((CraftPlayer) p).getHandle().getEnderChest().getSize());
|
|
||||||
CraftPlayer player = (CraftPlayer) p;
|
|
||||||
this.enderChest = player.getHandle().getEnderChest();
|
|
||||||
this.owner = player;
|
|
||||||
this.items = enderChest.getContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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 void update() {
|
|
||||||
super.update();
|
|
||||||
enderChest.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,229 +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.v1_5_R3;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_5_R3.ItemStack;
|
|
||||||
import net.minecraft.server.v1_5_R3.PlayerInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
|
|
||||||
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
|
|
||||||
|
|
||||||
private final ItemStack[] extra = new ItemStack[5];
|
|
||||||
private final CraftInventory inventory = new CraftInventory(this);
|
|
||||||
private boolean playerOnline = false;
|
|
||||||
|
|
||||||
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
|
|
||||||
super(((CraftPlayer) bukkitPlayer).getHandle());
|
|
||||||
this.playerOnline = online;
|
|
||||||
this.items = player.inventory.items;
|
|
||||||
this.armor = player.inventory.armor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Inventory getBukkitInventory() {
|
|
||||||
return inventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOnline(Player player) {
|
|
||||||
if (!playerOnline) {
|
|
||||||
this.player = ((CraftPlayer) player).getHandle();
|
|
||||||
this.player.inventory.items = this.items;
|
|
||||||
this.player.inventory.armor = this.armor;
|
|
||||||
playerOnline = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerOffline() {
|
|
||||||
playerOnline = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInUse() {
|
|
||||||
return !this.getViewers().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack[] getContents() {
|
|
||||||
ItemStack[] contents = new ItemStack[getSize()];
|
|
||||||
System.arraycopy(items, 0, contents, 0, items.length);
|
|
||||||
System.arraycopy(armor, 0, contents, items.length, armor.length);
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is[i] != null) {
|
|
||||||
ItemStack itemstack;
|
|
||||||
|
|
||||||
if (is[i].count <= j) {
|
|
||||||
itemstack = is[i];
|
|
||||||
is[i] = null;
|
|
||||||
return itemstack;
|
|
||||||
} else {
|
|
||||||
itemstack = is[i].a(j);
|
|
||||||
if (is[i].count == 0) {
|
|
||||||
is[i] = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is[i] != null) {
|
|
||||||
ItemStack itemstack = is[i];
|
|
||||||
|
|
||||||
is[i] = null;
|
|
||||||
return itemstack;
|
|
||||||
}
|
|
||||||
|
|
||||||
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.extra;
|
|
||||||
} else if (is == this.armor) {
|
|
||||||
i = getReversedArmorSlotNum(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Effects
|
|
||||||
if (is == this.extra) {
|
|
||||||
player.drop(itemstack);
|
|
||||||
itemstack = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
is[i] = itemstack;
|
|
||||||
|
|
||||||
player.defaultContainer.b();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getReversedItemSlotNum(int i) {
|
|
||||||
if (i >= 27) {
|
|
||||||
return i - 27;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
if (player.getName().length() > 16) {
|
|
||||||
return player.getName().substring(0, 16);
|
|
||||||
}
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<parent>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinv</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<artifactId>openinvadapter1_6_R1</artifactId>
|
|
||||||
<name>OpenInvAdapter1_6_R1</name>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.lishid</groupId>
|
|
||||||
<artifactId>openinvplugin</artifactId>
|
|
||||||
<version>1.0-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>craftbukkit</artifactId>
|
|
||||||
<version>1.6.1-R0.1-SNAPSHOT</version>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
</project>
|
|
||||||
@@ -1,168 +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.v1_6_R1;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_6_R1.AxisAlignedBB;
|
|
||||||
import net.minecraft.server.v1_6_R1.BlockEnderChest;
|
|
||||||
import net.minecraft.server.v1_6_R1.EntityOcelot;
|
|
||||||
import net.minecraft.server.v1_6_R1.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_6_R1.IInventory;
|
|
||||||
import net.minecraft.server.v1_6_R1.InventoryEnderChest;
|
|
||||||
import net.minecraft.server.v1_6_R1.InventoryLargeChest;
|
|
||||||
import net.minecraft.server.v1_6_R1.Packet100OpenWindow;
|
|
||||||
import net.minecraft.server.v1_6_R1.TileEntityChest;
|
|
||||||
import net.minecraft.server.v1_6_R1.TileEntityEnderChest;
|
|
||||||
import net.minecraft.server.v1_6_R1.World;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
|
|
||||||
|
|
||||||
public class AnySilentContainer implements IAnySilentContainer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnySilentContainer(org.bukkit.block.Block block) {
|
|
||||||
return block.getType() == Material.ENDER_CHEST || block.getState() instanceof org.bukkit.block.Chest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
|
|
||||||
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
World world = player.world;
|
|
||||||
|
|
||||||
if (block instanceof BlockEnderChest) {
|
|
||||||
// Ender chests are not blocked by ocelots.
|
|
||||||
return world.t(block.getX(), block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If block or ocelot on top
|
|
||||||
if (isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
// If block next to chest is chest and has a block or ocelot on top
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() + 1);
|
|
||||||
} else if(world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
return isBlockedChest(world, block.getX(), block.getY() + 1, block.getZ() - 1);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() + 1, block.getY() + 1, block.getZ());
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
return isBlockedChest(world, block.getX() - 1, block.getY() + 1, block.getZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBlockedChest(World world, int x, int y, int z) {
|
|
||||||
return world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasOcelotOnTop(World world, int x, int y, int z) {
|
|
||||||
for (Object localEntity : world.a(EntityOcelot.class,
|
|
||||||
AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
|
|
||||||
EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
|
|
||||||
if (localEntityOcelot.isSitting()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
|
|
||||||
|
|
||||||
EntityPlayer player = ((CraftPlayer) p).getHandle();
|
|
||||||
|
|
||||||
// Silent ender chest is API-only
|
|
||||||
if (silentchest && block.getType() == Material.ENDER_CHEST) {
|
|
||||||
p.openInventory(p.getEnderChest());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
World world = player.world;
|
|
||||||
Object tile = world.getTileEntity(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (tile == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile instanceof TileEntityEnderChest) {
|
|
||||||
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
|
|
||||||
InventoryEnderChest enderChest = player.getEnderChest();
|
|
||||||
enderChest.a((TileEntityEnderChest) tile);
|
|
||||||
player.openContainer(enderChest);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(tile instanceof IInventory)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
|
|
||||||
|
|
||||||
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
|
|
||||||
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile);
|
|
||||||
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
|
|
||||||
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
|
|
||||||
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean returnValue = false;
|
|
||||||
if (!silentchest) {
|
|
||||||
player.openContainer((IInventory) tile);
|
|
||||||
returnValue = true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
int windowId = 0;
|
|
||||||
try {
|
|
||||||
Field windowID = player.getClass().getDeclaredField("containerCounter");
|
|
||||||
windowID.setAccessible(true);
|
|
||||||
windowId = windowID.getInt(player);
|
|
||||||
windowId = windowId % 100 + 1;
|
|
||||||
windowID.setInt(player, windowId);
|
|
||||||
} catch (NoSuchFieldException e) {}
|
|
||||||
|
|
||||||
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
|
|
||||||
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
|
|
||||||
player.activeContainer.windowId = windowId;
|
|
||||||
player.activeContainer.addSlotListener(player);
|
|
||||||
returnValue = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,79 +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.v1_6_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
|
||||||
import com.lishid.openinv.internal.InternalAccessor;
|
|
||||||
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_6_R1.IInventory;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;
|
|
||||||
|
|
||||||
public class InventoryAccess implements IInventoryAccess {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialPlayerInventory getSpecialPlayerInventory(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialPlayerInventory) {
|
|
||||||
return (SpecialPlayerInventory) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSpecialEnderChest(Inventory inventory) {
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ISpecialEnderChest getSpecialEnderChest(Inventory inventory) {
|
|
||||||
IInventory inv;
|
|
||||||
if (inventory instanceof CraftInventory) {
|
|
||||||
inv = ((CraftInventory) inventory).getInventory();
|
|
||||||
} else {
|
|
||||||
inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inv instanceof SpecialEnderChest) {
|
|
||||||
return (SpecialEnderChest) inv;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,62 +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.v1_6_R1;
|
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
// Volatile
|
|
||||||
import net.minecraft.server.v1_6_R1.EntityPlayer;
|
|
||||||
import net.minecraft.server.v1_6_R1.MinecraftServer;
|
|
||||||
import net.minecraft.server.v1_6_R1.PlayerInteractManager;
|
|
||||||
|
|
||||||
import org.bukkit.craftbukkit.v1_6_R1.CraftServer;
|
|
||||||
|
|
||||||
public class PlayerDataManager implements IPlayerDataManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Player loadPlayer(OfflinePlayer offline) {
|
|
||||||
// Ensure the player has data
|
|
||||||
if (offline == null || !offline.hasPlayedBefore()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
|
|
||||||
|
|
||||||
// Create an entity to load the player data
|
|
||||||
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), offline.getName(),
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPlayerDataID(OfflinePlayer player) {
|
|
||||||
return player.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user