Compare commits

...

16 Commits
4.0.7 ... 2.4.0

Author SHA1 Message Date
Jikoo
fb48f6a783 Fix up legacy code to use new interfaces
This took way more time than it was worth.
Converted line endings to Unix, some other trivial crap.
Thanks to Phoenix616 for already having a multi-version pom, it would have taken me much longer to figure out without a functional example.

The only legacy code which is not supported is that of the pre-versioned package era. I compiled a copy of Craftbukkit about 15 commits prior to the introduction of versioned packages, and NMS had already been fiddled with. Anyone who needs support for builds in that range can use an older OpenInv build instead, it's not like UUIDs are a big concern.
2016-03-04 05:49:07 -05:00
Jikoo
d761b6bfe4 Actually allow for offhand modification, whoops. 2016-03-04 00:53:21 -05:00
Jikoo
5b3ba79b82 Maven, huge refactor, interface changes
Among other things, these interface changes allow for supporting pre-UUID Minecraft versions again. I may eventually backport older versions, but I don't know that I'll be able to lay hands on old enough jars.
Removed static access
Renamed all methods to follow conventions
2016-03-03 23:33:54 -05:00
Jikoo
3549431fbc Removed item wand functionality
Anyone who can use it has to be able to run the command anyway. If they can run the command, they can use tab completion to automatically fill in anyone online's name. There's no need to keep around a bunch of deprecated code for a function I sincerely doubt anyone actually uses.
2016-03-01 12:30:12 -05:00
Jikoo
17b0cb6efe Fix players without permission to modify inventories inserting items 2016-03-01 12:22:26 -05:00
Jikoo
2d7522554c Use AnyChest when an ocelot is on a chest.
Closes #2
2016-03-01 12:09:29 -05:00
Jikoo
131f874329 Added offhand slot display and manipulation 2016-03-01 11:44:38 -05:00
Jikoo
a623af5119 1.9.0 2016-03-01 00:52:57 -05:00
Jikoo
8f17bd0237 Remove update checker and bumped version for release
Added myself to the authors list as I've been maintaining this fork for a while
2015-11-16 23:21:34 -05:00
Jikoo
20fb61705d Update to 1.8.8, properly declare permissions in plugin.yml 2015-11-16 23:12:46 -05:00
Jikoo
c0f513177a Removed additional async lookup notification, current is pretty fast. 2015-05-19 08:11:53 -04:00
Jikoo
b3a3947b03 1.8.4
The easiest NMS update ever.
2015-05-19 08:10:39 -04:00
Jikoo
c7bab7d451 Whoops, didn't make sure my autoformatter's settings matched the style. 2015-03-12 16:42:00 -04:00
Jikoo
4058463f7f OpenInv 2.2.7
Updated for Spigot 1.8.3
Dropped support for all other versions
Fixed lookup not working for players on first login/incomplete names
2015-03-11 16:48:21 -04:00
Jikoo
21cd1926ae Don't find username on the main thread. Not friendly with partial names. 2014-12-01 16:11:52 -05:00
Jikoo
2a66b2e81b Updated to Spigot 1.8 2014-12-01 14:10:14 -05:00
137 changed files with 10735 additions and 9708 deletions

View File

@@ -1,3 +0,0 @@
#Wed Jun 01 17:38:54 EDT 2011
eclipse.preferences.version=1
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false

View File

@@ -1,13 +1,26 @@
Copyright (C) 2011-2014 lishid. All rights reserved. ## Goals
This fork of OpenInv was created when the lag caused by offline player lookups post-UUID migration became too much to bear. Overall, it does not differ much from the original.
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 ### Changes of Note
the Free Software Foundation, version 3. - Removed updater
- Removed wand
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of ## Previous Versions
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Any version of Minecraft this fork has been existent for should have a [release](https://github.com/Jikoo/OpenInv/releases) tagged. Features are not backported, however.
GNU General Public License for more details.
## License
You should have received a copy of the GNU General Public License ```
along with this program. If not, see <http://www.gnu.org/licenses/>. 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/>.
```

141
pom.xml Normal file
View File

@@ -0,0 +1,141 @@
<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>OpenInv</groupId>
<artifactId>OpenInv</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.9-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_9_R1</classifier>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.8.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_8_R3</classifier>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.8.3-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_8_R2</classifier>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_8_R1</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.7.10-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_7_R4</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.7.9-R0.2-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_7_R3</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.7.5-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_7_R2</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.7.2-R0.4-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_7_R1</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.6.4-R2.0-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_6_R3</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.6.2-R1.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_6_R2</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.6.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_6_R1</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.5.2-R1.0-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_5_R3</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.5.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_5_R2</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.5-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_5_R1</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.4.7-R1.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_4_R1</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.4.6-R0.4-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_4_6</classifier>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.4.5-R1.1-SNAPSHOT</version>
<scope>provided</scope>
<classifier>v1_4_5</classifier>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -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;
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);
}
}

View File

@@ -1,52 +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.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);
}
}
}

View File

@@ -1,60 +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 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;
}
}

View File

@@ -1,120 +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.craftbukkit;
import java.lang.reflect.Field;
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.*;
import org.bukkit.craftbukkit.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.s(x, y + 1, z))
return true;
// If block next to chest is chest and has a block on top
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true;
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
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(x, y, z);
if (chest == null)
return true;
if (!anychest) {
if (world.s(x, y + 1, z))
return true;
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true;
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
return true;
}
if (world.getTypeId(x - 1, y, z) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
if (world.getTypeId(x, y, z - 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
boolean returnValue = true;
if (!silentchest) {
player.openContainer((IInventory) chest);
}
else {
try {
int id = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
id = windowID.getInt(player);
id = id % 100 + 1;
windowID.setInt(player, id);
}
catch (NoSuchFieldException e) {}
player.netServerHandler.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize()));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = id;
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;
}
}

View File

@@ -1,97 +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.craftbukkit;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.*;
import org.bukkit.craftbukkit.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, 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;
}
}
catch (Exception e) {
OpenInv.log(e);
}
return null;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,253 +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.craftbukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
//Volatile
import net.minecraft.server.*;
import org.bukkit.craftbukkit.entity.*;
import org.bukkit.craftbukkit.inventory.*;
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);
public SpecialPlayerInventory(Player p, Boolean online) {
super(((CraftPlayer) p).getHandle());
this.owner = ((CraftPlayer) p);
this.playerOnline = online;
this.items = player.inventory.items;
this.armor = player.inventory.armor;
OpenInv.inventories.put(owner.getName().toLowerCase(), this);
}
@Override
public Inventory getBukkitInventory() {
return inventory;
}
@Override
public void InventoryRemovalCheck() {
owner.saveData();
if (transaction.isEmpty() && !playerOnline) {
OpenInv.inventories.remove(owner.getName().toLowerCase());
}
}
@Override
public void PlayerGoOnline(Player player) {
if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor;
p.saveData();
playerOnline = true;
}
}
@Override
public void PlayerGoOffline() {
playerOnline = false;
this.InventoryRemovalCheck();
}
@Override
public void onClose(CraftHumanEntity who) {
super.onClose(who);
this.InventoryRemovalCheck();
}
@Override
public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length);
return C;
}
@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) {
owner.getHandle().drop(itemstack);
itemstack = null;
}
is[i] = itemstack;
owner.getHandle().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.name.length() > 16) {
return player.name.substring(0, 16);
}
return player.name;
}
@Override
public boolean a_(EntityHuman entityhuman) {
return true;
}
}

View File

@@ -1,97 +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.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_4_5.*;
import org.bukkit.craftbukkit.v1_4_5.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, 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;
}
}
catch (Exception e) {
OpenInv.log(e);
}
return null;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,97 +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.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_4_6.*;
import org.bukkit.craftbukkit.v1_4_6.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,97 +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.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_4_R1.*;
import org.bukkit.craftbukkit.v1_4_R1.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,97 +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.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_5_R2.*;
import org.bukkit.craftbukkit.v1_5_R2.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, new PlayerInteractManager((World) 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,126 +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 org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.v1_5_R3.SilentContainerChest;
//Volatile
import net.minecraft.server.v1_5_R3.*;
import org.bukkit.craftbukkit.v1_5_R3.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.t(x, y + 1, z))
return true;
int id = world.getTypeId(x, y, z);
// If block next to chest is chest and has a block on top
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
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(x, y, z);
if (chest == null)
return true;
int id = world.getTypeId(x, y, z);
if (!anychest) {
if (world.t(x, y + 1, z))
return true;
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
return true;
}
if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
if (world.getTypeId(x, y, z - 1) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
if (world.getTypeId(x, y, z + 1) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
boolean returnValue = true;
if (!silentchest) {
player.openContainer((IInventory) chest);
}
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) chest).getName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
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;
}
}

View File

@@ -1,97 +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.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_5_R3.*;
import org.bukkit.craftbukkit.v1_5_R3.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, new PlayerInteractManager((World) 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,97 +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.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_6_R1.*;
import org.bukkit.craftbukkit.v1_6_R1.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, new PlayerInteractManager((World) 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,97 +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_R2;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_6_R2.*;
import org.bukkit.craftbukkit.v1_6_R2.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, new PlayerInteractManager((World) 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,97 +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_R3;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_6_R3.*;
import org.bukkit.craftbukkit.v1_6_R3.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
// Create an entity to load the player data
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), playername, new PlayerInteractManager((World) 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,99 +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_7_R1;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
import net.minecraft.util.com.mojang.authlib.GameProfile;
//Volatile
import net.minecraft.server.v1_7_R1.*;
import org.bukkit.craftbukkit.v1_7_R1.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(null, playername);
// 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,99 +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_7_R2;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.internal.IPlayerDataManager;
import net.minecraft.util.com.mojang.authlib.GameProfile;
//Volatile
import net.minecraft.server.v1_7_R2.*;
import org.bukkit.craftbukkit.v1_7_R2.*;
public class PlayerDataManager implements IPlayerDataManager {
public Player loadPlayer(String name) {
try {
// Default player folder
File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "players");
if (!playerfolder.exists()) {
return null;
}
String playername = matchUser(Arrays.asList(playerfolder.listFiles()), name);
if (playername == null) {
return null;
}
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(null, playername);
// 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;
}
/**
* @author Balor (aka Antoine Aflalo)
*/
private static String matchUser(final Collection<File> container, final String search) {
String found = null;
if (search == null) {
return found;
}
final String lowerSearch = search.toLowerCase();
int delta = Integer.MAX_VALUE;
for (final File file : container) {
final String filename = file.getName();
final String str = filename.substring(0, filename.length() - 4);
if (!str.toLowerCase().startsWith(lowerSearch)) {
continue;
}
final int curDelta = str.length() - lowerSearch.length();
if (curDelta < delta) {
found = str;
delta = curDelta;
}
if (curDelta == 0) {
break;
}
}
return found;
}
}

View File

@@ -1,101 +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_7_R3;
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 net.minecraft.util.com.mojang.authlib.GameProfile;
//Volatile
import net.minecraft.server.v1_7_R3.*;
import org.bukkit.craftbukkit.v1_7_R3.*;
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.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;
}
}

View File

@@ -1,104 +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_7_R4;
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 net.minecraft.util.com.mojang.authlib.GameProfile;
//Volatile
import net.minecraft.server.v1_7_R4.*;
import org.bukkit.craftbukkit.v1_7_R4.*;
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;
}
}

View File

@@ -1,510 +0,0 @@
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;
}
}
}

View File

@@ -1,34 +0,0 @@
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
}
}

View File

@@ -1,412 +0,0 @@
/*
* 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;
}
}

View File

@@ -0,0 +1,220 @@
/*
* 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.Map;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
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.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.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;
/**
* 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 InternalAccessor accessor;
private IPlayerDataManager playerLoader;
private IInventoryAccess inventoryAccess;
private IAnySilentChest anySilentChest;
@Override
public void onEnable() {
// Get plugin manager
PluginManager pm = getServer().getPluginManager();
accessor = new InternalAccessor(this);
// Version check
if (!accessor.initialize(getServer())) {
getLogger().info("Your version of CraftBukkit is not supported.");
getLogger().info("Please look for an updated version of OpenInv.");
pm.disablePlugin(this);
return;
}
playerLoader = accessor.newPlayerDataManager();
inventoryAccess = accessor.newInventoryAccess();
anySilentChest = accessor.newAnySilentChest();
FileConfiguration config = getConfig();
config.set("NotifySilentChest", config.getBoolean("NotifySilentChest", true));
config.set("NotifyAnyChest", config.getBoolean("NotifyAnyChest", true));
config.addDefault("NotifySilentChest", true);
config.addDefault("NotifyAnyChest", true);
config.options().copyDefaults(true);
saveConfig();
pm.registerEvents(new OpenInvPlayerListener(this), this);
pm.registerEvents(new OpenInvInventoryListener(this), this);
getCommand("openinv").setExecutor(new OpenInvPluginCommand(this));
getCommand("searchinv").setExecutor(new SearchInvPluginCommand());
getCommand("silentchest").setExecutor(new SilentChestPluginCommand(this));
getCommand("anychest").setExecutor(new AnyChestPluginCommand(this));
getCommand("openender").setExecutor(new OpenEnderPluginCommand(this));
}
public InternalAccessor getInternalAccessor() {
return this.accessor;
}
public IPlayerDataManager getPlayerLoader() {
return this.playerLoader;
}
public IInventoryAccess getInventoryAccess() {
return this.inventoryAccess;
}
public IAnySilentChest getAnySilentChest() {
return this.anySilentChest;
}
public ISpecialPlayerInventory getInventoryFor(Player player) {
String id = getPlayerLoader().getPlayerDataID(player);
if (inventories.containsKey(id)) {
return inventories.get(id);
}
return null;
}
public ISpecialPlayerInventory getOrCreateInventoryFor(Player player, boolean offline) {
String id = getPlayerLoader().getPlayerDataID(player);
if (inventories.containsKey(id)) {
return inventories.get(id);
}
ISpecialPlayerInventory inv = getInternalAccessor().newSpecialPlayerInventory(player, offline);
inventories.put(id, inv);
return inv;
}
public void removeLoadedInventory(Player player) {
String id = getPlayerLoader().getPlayerDataID(player);
if (inventories.containsKey(id)) {
inventories.remove(id);
}
}
public ISpecialEnderChest getEnderChestFor(Player player) {
String id = getPlayerLoader().getPlayerDataID(player);
if (enderChests.containsKey(id)) {
return enderChests.get(id);
}
return null;
}
public ISpecialEnderChest getOrCreateEnderChestFor(Player player, boolean offline) {
String id = getPlayerLoader().getPlayerDataID(player);
if (enderChests.containsKey(id)) {
return enderChests.get(id);
}
ISpecialEnderChest inv = getInternalAccessor().newSpecialEnderChest(player, offline);
enderChests.put(id, inv);
return inv;
}
public void removeLoadedEnderChest(Player player) {
String id = getPlayerLoader().getPlayerDataID(player);
if (enderChests.containsKey(id)) {
enderChests.remove(id);
}
}
public boolean notifySilentChest() {
return getConfig().getBoolean("NotifySilentChest", true);
}
public boolean notifyAnyChest() {
return getConfig().getBoolean("NotifyAnyChest", true);
}
public boolean getPlayerItemOpenInvStatus(OfflinePlayer player) {
return getConfig().getBoolean("ItemOpenInv." + getPlayerLoader().getPlayerDataID(player) + ".toggle", false);
}
public void setPlayerItemOpenInvStatus(OfflinePlayer player, boolean status) {
getConfig().set("ItemOpenInv." + getPlayerLoader().getPlayerDataID(player) + ".toggle", status);
saveConfig();
}
public boolean getPlayerSilentChestStatus(OfflinePlayer player) {
return getConfig().getBoolean("SilentChest." + getPlayerLoader().getPlayerDataID(player) + ".toggle", false);
}
public void setPlayerSilentChestStatus(OfflinePlayer player, boolean status) {
getConfig().set("SilentChest." + getPlayerLoader().getPlayerDataID(player) + ".toggle", status);
saveConfig();
}
public boolean getPlayerAnyChestStatus(OfflinePlayer player) {
return getConfig().getBoolean("AnyChest." + getPlayerLoader().getPlayerDataID(player) + ".toggle", true);
}
public void setPlayerAnyChestStatus(OfflinePlayer player, boolean status) {
getConfig().set("AnyChest." + getPlayerLoader().getPlayerDataID(player) + ".toggle", status);
saveConfig();
}
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 + "/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);
}
}

View File

@@ -1,35 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
public class OpenInvInventoryListener implements Listener {
@EventHandler(priority = EventPriority.NORMAL) public class OpenInvInventoryListener implements Listener {
public void onInventoryClick(InventoryClickEvent event) {
// If this is the top inventory private final OpenInv plugin;
// if (event.getView().convertSlot(event.getRawSlot()) == event.getRawSlot())
// { public OpenInvInventoryListener(OpenInv plugin) {
if (!OpenInv.inventoryAccess.check(event.getInventory(), event.getWhoClicked())) { this.plugin = plugin;
event.setCancelled(true); }
}
// } @EventHandler(priority = EventPriority.NORMAL)
} public void onInventoryClick(InventoryClickEvent event) {
} // If this is the top inventory
// if (event.getView().convertSlot(event.getRawSlot()) == event.getRawSlot())
// {
if (!plugin.getInventoryAccess().check(event.getInventory(), event.getWhoClicked())) {
event.setCancelled(true);
}
// }
}
@EventHandler(priority = EventPriority.NORMAL)
public void onInventoryDrag(InventoryDragEvent event) {
if (!plugin.getInventoryAccess().check(event.getInventory(), event.getWhoClicked())) {
event.setCancelled(true);
}
}
}

View File

@@ -1,133 +1,128 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.block.Chest; import org.bukkit.block.Chest;
import org.bukkit.block.Sign; import org.bukkit.entity.Player;
import org.bukkit.entity.Player; import org.bukkit.event.Event.Result;
import org.bukkit.event.Event.Result; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority;
import org.bukkit.event.EventPriority; import org.bukkit.event.Listener;
import org.bukkit.event.Listener; import org.bukkit.event.block.Action;
import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
public class OpenInvPlayerListener implements Listener {
public class OpenInvPlayerListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST) private final OpenInv plugin;
public void onPlayerJoin(PlayerJoinEvent event) {
ISpecialPlayerInventory inventory = OpenInv.inventories.get(event.getPlayer().getName().toLowerCase()); public OpenInvPlayerListener(OpenInv plugin) {
this.plugin = plugin;
if (inventory != null) { }
inventory.PlayerGoOnline(event.getPlayer());
} @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event) {
ISpecialEnderChest chest = OpenInv.enderChests.get(event.getPlayer().getName().toLowerCase()); ISpecialPlayerInventory inventory = plugin.getInventoryFor(event.getPlayer());
if (chest != null) { if (inventory != null) {
chest.PlayerGoOnline(event.getPlayer()); inventory.setPlayerOnline(event.getPlayer());
} }
}
ISpecialEnderChest chest = plugin.getEnderChestFor(event.getPlayer());
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) { if (chest != null) {
ISpecialPlayerInventory inventory = OpenInv.inventories.get(event.getPlayer().getName().toLowerCase()); chest.setPlayerOnline(event.getPlayer());
if (inventory != null) { }
inventory.PlayerGoOffline(); }
}
ISpecialEnderChest chest = OpenInv.enderChests.get(event.getPlayer().getName().toLowerCase()); @EventHandler(priority = EventPriority.MONITOR)
if (chest != null) { public void onPlayerQuit(PlayerQuitEvent event) {
chest.PlayerGoOffline(); ISpecialPlayerInventory inventory = plugin.getInventoryFor(event.getPlayer());
} if (inventory != null) {
} if (inventory.setPlayerOffline()) {
plugin.removeLoadedInventory(event.getPlayer());
@EventHandler(priority = EventPriority.MONITOR) }
public void onPlayerInteract(PlayerInteractEvent event) { }
Player player = event.getPlayer(); ISpecialEnderChest chest = plugin.getEnderChestFor(event.getPlayer());
if (chest != null) {
if (event.getPlayer().isSneaking()) { if (chest.setPlayerOffline()) {
return; plugin.removeLoadedEnderChest(event.getPlayer());
} }
}
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.useInteractedBlock() == Result.DENY) { }
return;
} @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == org.bukkit.Material.ENDER_CHEST) { Player player = event.getPlayer();
if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && OpenInv.GetPlayerSilentChestStatus(player.getName())) {
event.setCancelled(true); if (event.getPlayer().isSneaking()) {
player.openInventory(player.getEnderChest()); return;
} }
}
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.useInteractedBlock() == Result.DENY) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getState() instanceof Chest) { return;
boolean silentchest = false; }
boolean anychest = false;
int x = event.getClickedBlock().getX(); if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == org.bukkit.Material.ENDER_CHEST) {
int y = event.getClickedBlock().getY(); if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && plugin.getPlayerSilentChestStatus(player)) {
int z = event.getClickedBlock().getZ(); event.setCancelled(true);
player.openInventory(player.getEnderChest());
if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && OpenInv.GetPlayerSilentChestStatus(player.getName())) { }
silentchest = true; }
}
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getState() instanceof Chest) {
if (OpenInv.hasPermission(player, Permissions.PERM_ANYCHEST) && OpenInv.GetPlayerAnyChestStatus(player.getName())) { boolean silentchest = false;
try { boolean anychest = false;
anychest = OpenInv.anySilentChest.IsAnyChestNeeded(player, x, y, z); int x = event.getClickedBlock().getX();
} int y = event.getClickedBlock().getY();
catch (Exception e) { int z = event.getClickedBlock().getZ();
player.sendMessage(ChatColor.RED + "Error while executing openinv. Unsupported CraftBukkit.");
e.printStackTrace(); if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && plugin.getPlayerSilentChestStatus(player)) {
} silentchest = true;
} }
// If the anychest or silentchest is active if (OpenInv.hasPermission(player, Permissions.PERM_ANYCHEST) && plugin.getPlayerAnyChestStatus(player)) {
if (anychest || silentchest) { try {
if (!OpenInv.anySilentChest.ActivateChest(player, anychest, silentchest, x, y, z)) { anychest = plugin.getAnySilentChest().isAnyChestNeeded(player, x, y, z);
event.setCancelled(true); }
} catch (Exception e) {
} player.sendMessage(ChatColor.RED + "Error while executing openinv. Unsupported CraftBukkit.");
} e.printStackTrace();
}
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getState() instanceof Sign) { }
try {
Sign sign = ((Sign) event.getClickedBlock().getState()); // If the anychest or silentchest is active
if (OpenInv.hasPermission(player, Permissions.PERM_OPENINV) && sign.getLine(0).equalsIgnoreCase("[openinv]")) { if (anychest || silentchest) {
String text = sign.getLine(1).trim() + sign.getLine(2).trim() + sign.getLine(3).trim(); if (!plugin.getAnySilentChest().activateChest(player, anychest, silentchest, x, y, z)) {
player.performCommand("openinv " + text); if (silentchest && plugin.notifySilentChest()) {
} player.sendMessage("You are opening a chest silently.");
} }
catch (Exception ex) { if (anychest && plugin.notifyAnyChest()) {
player.sendMessage("Internal Error."); player.sendMessage("You are opening a blocked chest.");
ex.printStackTrace(); }
} event.setCancelled(true);
} }
}
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");
}
}
}

View File

@@ -1,16 +1,16 @@
package com.lishid.openinv; package com.lishid.openinv;
public class Permissions { public class Permissions {
public static final String PERM_OPENINV = "OpenInv.openinv"; public static final String PERM_OPENINV = "OpenInv.openinv";
public static final String PERM_OVERRIDE = "OpenInv.override"; public static final String PERM_OVERRIDE = "OpenInv.override";
public static final String PERM_EXEMPT = "OpenInv.exempt"; public static final String PERM_EXEMPT = "OpenInv.exempt";
public static final String PERM_CROSSWORLD = "OpenInv.crossworld"; public static final String PERM_CROSSWORLD = "OpenInv.crossworld";
public static final String PERM_SILENT = "OpenInv.silent"; public static final String PERM_SILENT = "OpenInv.silent";
public static final String PERM_ANYCHEST = "OpenInv.anychest"; public static final String PERM_ANYCHEST = "OpenInv.anychest";
public static final String PERM_ENDERCHEST = "OpenInv.openender"; public static final String PERM_ENDERCHEST = "OpenInv.openender";
public static final String PERM_ENDERCHEST_ALL = "OpenInv.openenderall"; public static final String PERM_ENDERCHEST_ALL = "OpenInv.openenderall";
public static final String PERM_SEARCH = "OpenInv.search"; public static final String PERM_SEARCH = "OpenInv.search";
public static final String PERM_EDITINV = "OpenInv.editinv"; public static final String PERM_EDITINV = "OpenInv.editinv";
public static final String PERM_EDITENDER = "OpenInv.editender"; public static final String PERM_EDITENDER = "OpenInv.editender";
public static final String PERM_OPENSELF = "OpenInv.openself"; public static final String PERM_OPENSELF = "OpenInv.openself";
} }

View File

@@ -23,11 +23,13 @@ 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 {
public AnyChestPluginCommand(OpenInv plugin) {
private final 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) {
@@ -35,22 +37,20 @@ 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)) {
sender.sendMessage(ChatColor.RED + "You do not have permission to use anychest."); Player player = (Player) sender;
return true;
}
if (args.length > 0) { if (args.length > 0) {
if (args[0].equalsIgnoreCase("check")) { if (args[0].equalsIgnoreCase("check")) {
if (OpenInv.GetPlayerAnyChestStatus(sender.getName())) if (plugin.getPlayerAnyChestStatus(player))
sender.sendMessage("AnyChest is ON."); sender.sendMessage("AnyChest is ON.");
else else
sender.sendMessage("AnyChest is OFF."); sender.sendMessage("AnyChest is OFF.");
} }
} }
OpenInv.SetPlayerAnyChestStatus(sender.getName(), !OpenInv.GetPlayerAnyChestStatus(sender.getName())); plugin.setPlayerAnyChestStatus(player, !plugin.getPlayerAnyChestStatus(player));
sender.sendMessage("AnyChest is now " + (OpenInv.GetPlayerAnyChestStatus(sender.getName()) ? "On" : "Off") + "."); sender.sendMessage("AnyChest is now " + (plugin.getPlayerAnyChestStatus(player) ? "On" : "Off") + ".");
return true; return true;
} }

View File

@@ -17,17 +17,20 @@
package com.lishid.openinv.commands; package com.lishid.openinv.commands;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command; 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.scheduler.BukkitRunnable;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.InternalAccessor;
public class OpenEnderPluginCommand implements CommandExecutor { public class OpenEnderPluginCommand implements CommandExecutor {
private final OpenInv plugin; private final OpenInv plugin;
@@ -43,18 +46,12 @@ public class OpenEnderPluginCommand implements CommandExecutor {
return true; 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("?")) { if (args.length > 0 && args[0].equalsIgnoreCase("?")) {
OpenInv.ShowHelp((Player) sender); OpenInv.ShowHelp((Player) sender);
return true; return true;
} }
Player player = (Player) sender; final Player player = (Player) sender;
boolean offline = false;
// History management // History management
String history = openEnderHistory.get(player); String history = openEnderHistory.get(player);
@@ -64,55 +61,74 @@ public class OpenEnderPluginCommand implements CommandExecutor {
openEnderHistory.put(player, history); openEnderHistory.put(player, history);
} }
// Target selecting final String name;
Player target;
String name = "";
// Read from history if target is not named // Read from history if target is not named
if (args.length < 1) { if (args.length < 1) {
if (history != null && history != "") { name = history;
name = history;
}
else {
sender.sendMessage(ChatColor.RED + "OpenEnder history is empty!");
return true;
}
} }
else { else {
name = args[0]; name = args[0];
} }
target = this.plugin.getServer().getPlayer(name); new BukkitRunnable() {
public void run() {
if (target == null) { List<Player> matches = Bukkit.matchPlayer(name);
// Try loading the player's data final OfflinePlayer offlinePlayer;
target = OpenInv.playerLoader.loadPlayer(name); if (!matches.isEmpty()) {
offlinePlayer = matches.get(0);
if (target == null) { } else {
sender.sendMessage(ChatColor.RED + "Player " + name + " not found!"); offlinePlayer = Bukkit.getOfflinePlayer(name);
return true; }
if (!player.isOnline()) {
return;
}
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) {
player.sendMessage(ChatColor.RED + "Player not found!");
return;
}
new BukkitRunnable() {
public void run() {
if (!player.isOnline()) {
return;
}
openInventory(player, offlinePlayer);
}
}.runTask(plugin);
} }
} }.runTaskAsynchronously(plugin);
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; return true;
} }
private void openInventory(Player player, OfflinePlayer target) {
Player onlineTarget;
if (!target.isOnline()) {
// Try loading the player's data
onlineTarget = plugin.getPlayerLoader().loadPlayer(target);
if (onlineTarget == null) {
player.sendMessage(ChatColor.RED + "Player not found!");
return;
}
} else {
onlineTarget = target.getPlayer();
}
if (!onlineTarget.equals(player) && !OpenInv.hasPermission(player, Permissions.PERM_ENDERCHEST_ALL)) {
player.sendMessage(ChatColor.RED + "You do not have permission to access other player's enderchest");
return;
}
// Record the target
openEnderHistory.put(player, onlineTarget.getName());
// Create the inventory
ISpecialEnderChest chest = plugin.getOrCreateEnderChestFor(onlineTarget, !target.isOnline());
// Open the inventory
player.openInventory(chest.getBukkitInventory());
}
} }

View File

@@ -17,17 +17,20 @@
package com.lishid.openinv.commands; package com.lishid.openinv.commands;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command; 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.scheduler.BukkitRunnable;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor;
public class OpenInvPluginCommand implements CommandExecutor { public class OpenInvPluginCommand implements CommandExecutor {
private final OpenInv plugin; private final OpenInv plugin;
@@ -42,18 +45,13 @@ public class OpenInvPluginCommand 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_OPENINV)) {
sender.sendMessage(ChatColor.RED + "You do not have permission to access player inventories");
return true;
}
if (args.length > 0 && args[0].equalsIgnoreCase("?")) { if (args.length > 0 && args[0].equalsIgnoreCase("?")) {
OpenInv.ShowHelp((Player) sender); OpenInv.ShowHelp((Player) sender);
return true; return true;
} }
Player player = (Player) sender; final Player player = (Player) sender;
boolean offline = false;
// History management // History management
String history = openInvHistory.get(player); String history = openInvHistory.get(player);
@@ -63,10 +61,7 @@ public class OpenInvPluginCommand implements CommandExecutor {
openInvHistory.put(player, history); openInvHistory.put(player, history);
} }
// Target selecting final String name;
Player target;
String name = "";
// Read from history if target is not named // Read from history if target is not named
if (args.length < 1) { if (args.length < 1) {
@@ -76,51 +71,78 @@ public class OpenInvPluginCommand implements CommandExecutor {
name = args[0]; name = args[0];
} }
target = this.plugin.getServer().getPlayer(name); new BukkitRunnable() {
public void run() {
if (target == null) { List<Player> matches = Bukkit.matchPlayer(name);
if (target == null) { final OfflinePlayer offlinePlayer;
// Try loading the player's data if (!matches.isEmpty()) {
target = OpenInv.playerLoader.loadPlayer(name); offlinePlayer = matches.get(0);
} else {
if (target == null) { offlinePlayer = Bukkit.getOfflinePlayer(name);
sender.sendMessage(ChatColor.RED + "Player " + name + " not found!");
return true;
} }
if (!player.isOnline()) {
return;
}
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) {
player.sendMessage(ChatColor.RED + "Player not found!");
return;
}
new BukkitRunnable() {
public void run() {
if (!player.isOnline()) {
return;
}
openInventory(player, offlinePlayer);
}
}.runTask(plugin);
} }
} }.runTaskAsynchronously(plugin);
// 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; return true;
} }
private void openInventory(Player player, OfflinePlayer target) {
Player onlineTarget;
if (!target.isOnline()) {
// Try loading the player's data
onlineTarget = plugin.getPlayerLoader().loadPlayer(target);
if (onlineTarget == null) {
player.sendMessage(ChatColor.RED + "Player not found!");
return;
}
} else {
onlineTarget = target.getPlayer();
}
// Permissions checks
if (!OpenInv.hasPermission(player, Permissions.PERM_OVERRIDE) && OpenInv.hasPermission(onlineTarget, Permissions.PERM_EXEMPT)) {
player.sendMessage(ChatColor.RED + onlineTarget.getDisplayName() + "'s inventory is protected!");
return;
}
// Crosswork check
if ((!OpenInv.hasPermission(player, Permissions.PERM_CROSSWORLD) && !OpenInv.hasPermission(player, Permissions.PERM_OVERRIDE)) && onlineTarget.getWorld() != player.getWorld()) {
player.sendMessage(ChatColor.RED + onlineTarget.getDisplayName() + " is not in your world!");
return;
}
// Self-open check
if (!OpenInv.hasPermission(player, Permissions.PERM_OPENSELF) && onlineTarget.equals(player)) {
player.sendMessage(ChatColor.RED + "You're not allowed to openinv yourself.");
return;
}
// Record the target
openInvHistory.put(player, onlineTarget.getName());
// Create the inventory
ISpecialPlayerInventory inv = plugin.getOrCreateInventoryFor(onlineTarget, !target.isOnline());
// Open the inventory
player.openInventory(inv.getBukkitInventory());
}
} }

View File

@@ -24,22 +24,12 @@ 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 com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions;
public class SearchInvPluginCommand implements CommandExecutor { public class SearchInvPluginCommand implements CommandExecutor {
public SearchInvPluginCommand() { public SearchInvPluginCommand() {
} }
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 = ""; String PlayerList = "";
Material material = null; Material material = null;

View File

@@ -23,11 +23,13 @@ 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 {
public SilentChestPluginCommand(OpenInv plugin) {
private final 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) {
@@ -35,22 +37,20 @@ 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)) {
sender.sendMessage(ChatColor.RED + "You do not have permission to use silent chest."); Player player = (Player) sender;
return true;
}
if (args.length > 0) { if (args.length > 0) {
if (args[0].equalsIgnoreCase("check")) { if (args[0].equalsIgnoreCase("check")) {
if (OpenInv.GetPlayerSilentChestStatus(sender.getName())) if (plugin.getPlayerSilentChestStatus(player))
sender.sendMessage("SilentChest is ON."); sender.sendMessage("SilentChest is ON.");
else else
sender.sendMessage("SilentChest is OFF."); sender.sendMessage("SilentChest is OFF.");
} }
} }
OpenInv.SetPlayerSilentChestStatus(sender.getName(), !OpenInv.GetPlayerSilentChestStatus(sender.getName())); plugin.setPlayerSilentChestStatus(player, !plugin.getPlayerSilentChestStatus(player));
sender.sendMessage("SilentChest is now " + (OpenInv.GetPlayerSilentChestStatus(sender.getName()) ? "On" : "Off") + "."); sender.sendMessage("SilentChest is now " + (plugin.getPlayerSilentChestStatus(player) ? "On" : "Off") + ".");
return true; return true;
} }

View File

@@ -1,25 +1,25 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv.internal;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public interface IAnySilentChest { public interface IAnySilentChest {
public boolean IsAnyChestNeeded(Player p, int x, int y, int z); public boolean isAnyChestNeeded(Player player, int x, int y, int z);
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z); public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z);
} }

View File

@@ -1,24 +1,24 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv.internal;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
public interface IInventoryAccess { public interface IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player); public boolean check(Inventory inventory, HumanEntity player);
} }

View File

@@ -1,23 +1,26 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv.internal;
import org.bukkit.entity.Player; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
public interface IPlayerDataManager {
public Player loadPlayer(String name); public interface IPlayerDataManager {
} public Player loadPlayer(OfflinePlayer offline);
public String getPlayerDataID(OfflinePlayer player);
}

View File

@@ -1,31 +1,37 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv.internal;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
public interface ISpecialEnderChest { public interface ISpecialEnderChest {
public Inventory getBukkitInventory();
public Inventory getBukkitInventory();
public void InventoryRemovalCheck();
public boolean inventoryRemovalCheck();
public void PlayerGoOnline(Player p);
public void setPlayerOnline(Player p);
public void PlayerGoOffline();
/**
} * Sets the Player associated with this ISpecialEnderChest offline.
*
* @return true if the ISpecialEnderChest is eligible for removal
*/
public boolean setPlayerOffline();
}

View File

@@ -1,30 +1,36 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv.internal;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
public interface ISpecialPlayerInventory { public interface ISpecialPlayerInventory {
public Inventory getBukkitInventory();
public Inventory getBukkitInventory();
public void InventoryRemovalCheck();
public boolean inventoryRemovalCheck();
public void PlayerGoOnline(Player p);
public void setPlayerOnline(Player player);
public void PlayerGoOffline();
} /**
* Sets the Player associated with this ISpecialPlayerInventory offline.
*
* @return true if the ISpecialPlayerInventory is eligible for removal
*/
public boolean setPlayerOffline();
}

View File

@@ -1,105 +1,114 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; package com.lishid.openinv.internal;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
public class InternalAccessor { public class InternalAccessor {
public static InternalAccessor Instance;
private String version; private final OpenInv plugin;
/* private String version;
* Returns false if version not supported
*/ public InternalAccessor(OpenInv plugin) {
public static boolean Initialize(Server server) { this.plugin = plugin;
Instance = new InternalAccessor(); }
String packageName = server.getClass().getPackage().getName();
Instance.version = packageName.substring(packageName.lastIndexOf('.') + 1); /**
* Check if the current server version is supported, and, if it is, prepare to load version-specific code.
try { *
Class.forName("com.lishid.openinv.internal." + Instance.version + ".AnySilentChest"); * @param server the Server
return true; *
} * @return true if supported
catch (Exception e) { */
return false; public boolean initialize(Server server) {
} String packageName = server.getClass().getPackage().getName();
} version = packageName.substring(packageName.lastIndexOf('.') + 1);
public void PrintError() { try {
OpenInv.log("OpenInv encountered an error with the CraftBukkit version \"" + Instance.version + "\". Please look for an updated version of OpenInv."); Class.forName("com.lishid.openinv.internal." + version + ".AnySilentChest");
} return true;
}
public IPlayerDataManager newPlayerDataManager() { catch (Exception e) {
return (IPlayerDataManager) createObject(IPlayerDataManager.class, "PlayerDataManager"); return false;
} }
}
public IInventoryAccess newInventoryAccess() {
return (IInventoryAccess) createObject(IInventoryAccess.class, "InventoryAccess"); private void printErrorMessage() {
} plugin.getLogger().warning("OpenInv encountered an error with the CraftBukkit version \"" + version + "\". Please look for an updated version of OpenInv.");
}
public IAnySilentChest newAnySilentChest() {
return (IAnySilentChest) createObject(IAnySilentChest.class, "AnySilentChest"); public IPlayerDataManager newPlayerDataManager() {
} return (IPlayerDataManager) createObject(IPlayerDataManager.class, "PlayerDataManager");
}
public ISpecialPlayerInventory newSpecialPlayerInventory(Player player, boolean offline) {
try { public IInventoryAccess newInventoryAccess() {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialPlayerInventory"); return (IInventoryAccess) createObject(IInventoryAccess.class, "InventoryAccess");
if (ISpecialPlayerInventory.class.isAssignableFrom(internalClass)) { }
return (ISpecialPlayerInventory) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline);
} public IAnySilentChest newAnySilentChest() {
} return (IAnySilentChest) createObject(IAnySilentChest.class, "AnySilentChest");
catch (Exception e) { }
PrintError();
OpenInv.log(e); public ISpecialPlayerInventory newSpecialPlayerInventory(Player player, boolean offline) {
} try {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialPlayerInventory");
return null; if (ISpecialPlayerInventory.class.isAssignableFrom(internalClass)) {
} return (ISpecialPlayerInventory) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline);
}
public ISpecialEnderChest newSpecialEnderChest(Player player, boolean offline) { }
try { catch (Exception e) {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialEnderChest"); printErrorMessage();
if (ISpecialEnderChest.class.isAssignableFrom(internalClass)) { e.printStackTrace();
return (ISpecialEnderChest) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline); }
}
} return null;
catch (Exception e) { }
PrintError();
OpenInv.log(e); public ISpecialEnderChest newSpecialEnderChest(Player player, boolean offline) {
} try {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + ".SpecialEnderChest");
return null; if (ISpecialEnderChest.class.isAssignableFrom(internalClass)) {
} return (ISpecialEnderChest) internalClass.getConstructor(Player.class, Boolean.class).newInstance(player, offline);
}
private Object createObject(Class<? extends Object> assignableClass, String className) { }
try { catch (Exception e) {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + "." + className); printErrorMessage();
if (assignableClass.isAssignableFrom(internalClass)) { e.printStackTrace();
return internalClass.getConstructor().newInstance(); }
}
} return null;
catch (Exception e) { }
PrintError();
OpenInv.log(e); private Object createObject(Class<? extends Object> assignableClass, String className) {
} try {
Class<?> internalClass = Class.forName("com.lishid.openinv.internal." + version + "." + className);
return null; if (assignableClass.isAssignableFrom(internalClass)) {
} return internalClass.getConstructor().newInstance();
} }
}
catch (Exception e) {
printErrorMessage();
e.printStackTrace();
}
return null;
}
}

View File

@@ -1,120 +1,120 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_5;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
// Volatile
//Volatile import net.minecraft.server.v1_4_5.Block;
import net.minecraft.server.v1_4_5.*; import net.minecraft.server.v1_4_5.EntityPlayer;
import net.minecraft.server.v1_4_5.IInventory;
import org.bukkit.craftbukkit.v1_4_5.entity.*; import net.minecraft.server.v1_4_5.InventoryLargeChest;
import net.minecraft.server.v1_4_5.Packet100OpenWindow;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_4_5.TileEntityChest;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) { import net.minecraft.server.v1_4_5.World;
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
World world = player.world;
// If block on top public class AnySilentChest implements IAnySilentChest {
if (world.s(x, y + 1, z)) @Override
return true; public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
// If block next to chest is chest and has a block on top EntityPlayer player = ((CraftPlayer) p).getHandle();
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z))) World world = player.world;
return true; // If block on top
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z))) if (world.s(x, y + 1, z))
return true; return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true; // If block next to chest is chest and has a block on top
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1))) if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
return true; return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
return false; return true;
} if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true;
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
EntityPlayer player = ((CraftPlayer) p).getHandle(); return true;
World world = player.world;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); return false;
if (chest == null) }
return true;
@Override
if (!anychest) { public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
if (world.s(x, y + 1, z)) EntityPlayer player = ((CraftPlayer) p).getHandle();
return true; World world = player.world;
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z))) Object chest = world.getTileEntity(x, y, z);
return true; if (chest == null)
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z))) return true;
return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1))) if (!anychest) {
return true; if (world.s(x, y + 1, z))
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1))) return true;
return true; if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
} return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
if (world.getTypeId(x - 1, y, z) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
if (world.getTypeId(x + 1, y, z) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
if (world.getTypeId(x, y, z - 1) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest); }
if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); if (world.getTypeId(x - 1, y, z) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
boolean returnValue = true; if (world.getTypeId(x + 1, y, z) == Block.CHEST.id)
if (!silentchest) { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
player.openContainer((IInventory) chest); if (world.getTypeId(x, y, z - 1) == Block.CHEST.id)
} chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
else { if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
try { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
int id = 0;
try { boolean returnValue = true;
Field windowID = player.getClass().getDeclaredField("containerCounter"); if (!silentchest) {
windowID.setAccessible(true); player.openContainer((IInventory) chest);
id = windowID.getInt(player); }
id = id % 100 + 1; else {
windowID.setInt(player, id); try {
} int id = 0;
catch (NoSuchFieldException e) {} try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
player.netServerHandler.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize())); windowID.setAccessible(true);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); id = windowID.getInt(player);
player.activeContainer.windowId = id; id = id % 100 + 1;
player.activeContainer.addSlotListener(player); windowID.setInt(player, id);
if (OpenInv.NotifySilentChest()) { }
p.sendMessage("You are opening a chest silently."); catch (NoSuchFieldException e) {}
}
returnValue = false; player.netServerHandler.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize()));
} player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
catch (Exception e) { player.activeContainer.windowId = id;
e.printStackTrace(); player.activeContainer.addSlotListener(player);
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); returnValue = false;
} }
} catch (Exception e) {
e.printStackTrace();
if (anychest && OpenInv.NotifyAnyChest()) { p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
p.sendMessage("You are opening a blocked chest."); }
} }
return returnValue; return returnValue;
} }
} }

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_5;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_4_5.*; import net.minecraft.server.v1_4_5.IInventory;
import org.bukkit.craftbukkit.v1_4_5.inventory.*;
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,56 @@
/*
* 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 org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// 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) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_5;
//Volatile // Volatile
import net.minecraft.server.v1_4_5.*; import net.minecraft.server.v1_4_5.ContainerChest;
import net.minecraft.server.v1_4_5.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_4_5.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.f(); inv = i2;
} // close signal
inv.f();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_5;
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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_4_5.EntityHuman;
import net.minecraft.server.v1_4_5.*; import net.minecraft.server.v1_4_5.IInventory;
import org.bukkit.craftbukkit.v1_4_5.entity.*; import net.minecraft.server.v1_4_5.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_4_5.inventory.*; import net.minecraft.server.v1_4_5.InventorySubcontainer;
import net.minecraft.server.v1_4_5.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_4_5.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
} CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return this.inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} public boolean a(EntityHuman entityhuman) {
} return true;
}
@Override
public void startOpen() {
}
@Override
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_5;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_4_5.EntityHuman;
import net.minecraft.server.v1_4_5.*; import net.minecraft.server.v1_4_5.ItemStack;
import org.bukkit.craftbukkit.v1_4_5.entity.*; import net.minecraft.server.v1_4_5.PlayerInventory;
import org.bukkit.craftbukkit.v1_4_5.inventory.*;
import org.bukkit.craftbukkit.v1_4_5.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack); owner.getHandle().drop(itemstack);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getName() { public String getName() {
if (player.name.length() > 16) { if (player.name.length() > 16) {
return player.name.substring(0, 16); return player.name.substring(0, 16);
} }
return player.name; return player.name;
} }
@Override @Override
public boolean a_(EntityHuman entityhuman) { public boolean a_(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -1,120 +1,120 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_6;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
import net.minecraft.server.v1_4_6.Block;
//Volatile import net.minecraft.server.v1_4_6.EntityPlayer;
import net.minecraft.server.v1_4_6.*; import net.minecraft.server.v1_4_6.IInventory;
import net.minecraft.server.v1_4_6.InventoryLargeChest;
import org.bukkit.craftbukkit.v1_4_6.entity.*; import net.minecraft.server.v1_4_6.Packet100OpenWindow;
import net.minecraft.server.v1_4_6.TileEntityChest;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_4_6.World;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // Volatile
EntityPlayer player = ((CraftPlayer) p).getHandle(); import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
World world = player.world;
// If block on top public class AnySilentChest implements IAnySilentChest {
if (world.s(x, y + 1, z)) @Override
return true; public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
// If block next to chest is chest and has a block on top EntityPlayer player = ((CraftPlayer) p).getHandle();
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z))) World world = player.world;
return true; // If block on top
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z))) if (world.s(x, y + 1, z))
return true; return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true; // If block next to chest is chest and has a block on top
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1))) if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
return true; return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
return false; return true;
} if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true;
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
EntityPlayer player = ((CraftPlayer) p).getHandle(); return true;
World world = player.world;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); return false;
if (chest == null) }
return true;
@Override
if (!anychest) { public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
if (world.s(x, y + 1, z)) EntityPlayer player = ((CraftPlayer) p).getHandle();
return true; World world = player.world;
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z))) Object chest = world.getTileEntity(x, y, z);
return true; if (chest == null)
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z))) return true;
return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1))) if (!anychest) {
return true; if (world.s(x, y + 1, z))
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1))) return true;
return true; if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
} return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
if (world.getTypeId(x - 1, y, z) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
if (world.getTypeId(x + 1, y, z) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
if (world.getTypeId(x, y, z - 1) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest); }
if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); if (world.getTypeId(x - 1, y, z) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
boolean returnValue = true; if (world.getTypeId(x + 1, y, z) == Block.CHEST.id)
if (!silentchest) { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
player.openContainer((IInventory) chest); if (world.getTypeId(x, y, z - 1) == Block.CHEST.id)
} chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
else { if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
try { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
int id = 0;
try { boolean returnValue = true;
Field windowID = player.getClass().getDeclaredField("containerCounter"); if (!silentchest) {
windowID.setAccessible(true); player.openContainer((IInventory) chest);
id = windowID.getInt(player); }
id = id % 100 + 1; else {
windowID.setInt(player, id); try {
} int id = 0;
catch (NoSuchFieldException e) {} try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
player.playerConnection.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize())); windowID.setAccessible(true);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); id = windowID.getInt(player);
player.activeContainer.windowId = id; id = id % 100 + 1;
player.activeContainer.addSlotListener(player); windowID.setInt(player, id);
if (OpenInv.NotifySilentChest()) { }
p.sendMessage("You are opening a chest silently."); catch (NoSuchFieldException e) {}
}
returnValue = false; player.playerConnection.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize()));
} player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
catch (Exception e) { player.activeContainer.windowId = id;
e.printStackTrace(); player.activeContainer.addSlotListener(player);
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); returnValue = false;
} }
} catch (Exception e) {
e.printStackTrace();
if (anychest && OpenInv.NotifyAnyChest()) { p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
p.sendMessage("You are opening a blocked chest."); }
} }
return returnValue; return returnValue;
} }
} }

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_6;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile import net.minecraft.server.v1_4_6.IInventory;
import net.minecraft.server.v1_4_6.*;
import org.bukkit.craftbukkit.v1_4_6.inventory.*; // Volatile
import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,56 @@
/*
* 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 org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// 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) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_6;
//Volatile // Volatile
import net.minecraft.server.v1_4_6.*; import net.minecraft.server.v1_4_6.ContainerChest;
import net.minecraft.server.v1_4_6.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_4_6.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.f(); inv = i2;
} // close signal
inv.f();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_6;
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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_4_6.EntityHuman;
import net.minecraft.server.v1_4_6.*; import net.minecraft.server.v1_4_6.IInventory;
import org.bukkit.craftbukkit.v1_4_6.entity.*; import net.minecraft.server.v1_4_6.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_4_6.inventory.*; import net.minecraft.server.v1_4_6.InventorySubcontainer;
import net.minecraft.server.v1_4_6.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_4_6.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
} CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} public boolean a(EntityHuman entityhuman) {
} return true;
}
@Override
public void startOpen() {
}
@Override
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_4_6;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_4_6.EntityHuman;
import net.minecraft.server.v1_4_6.*; import net.minecraft.server.v1_4_6.ItemStack;
import org.bukkit.craftbukkit.v1_4_6.entity.*; import net.minecraft.server.v1_4_6.PlayerInventory;
import org.bukkit.craftbukkit.v1_4_6.inventory.*;
import org.bukkit.craftbukkit.v1_4_6.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack); owner.getHandle().drop(itemstack);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getName() { public String getName() {
if (player.name.length() > 16) { if (player.name.length() > 16) {
return player.name.substring(0, 16); return player.name.substring(0, 16);
} }
return player.name; return player.name;
} }
@Override @Override
public boolean a_(EntityHuman entityhuman) { public boolean a_(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -1,120 +1,120 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_R1; package com.lishid.openinv.internal.v1_4_R1;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
import net.minecraft.server.v1_4_R1.Block;
//Volatile import net.minecraft.server.v1_4_R1.EntityPlayer;
import net.minecraft.server.v1_4_R1.*; import net.minecraft.server.v1_4_R1.IInventory;
import net.minecraft.server.v1_4_R1.InventoryLargeChest;
import org.bukkit.craftbukkit.v1_4_R1.entity.*; import net.minecraft.server.v1_4_R1.Packet100OpenWindow;
import net.minecraft.server.v1_4_R1.TileEntityChest;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_4_R1.World;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // Volatile
EntityPlayer player = ((CraftPlayer) p).getHandle(); import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
World world = player.world;
// If block on top public class AnySilentChest implements IAnySilentChest {
if (world.s(x, y + 1, z)) @Override
return true; public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
// If block next to chest is chest and has a block on top EntityPlayer player = ((CraftPlayer) p).getHandle();
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z))) World world = player.world;
return true; // If block on top
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z))) if (world.s(x, y + 1, z))
return true; return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true; // If block next to chest is chest and has a block on top
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1))) if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
return true; return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
return false; return true;
} if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
return true;
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
EntityPlayer player = ((CraftPlayer) p).getHandle(); return true;
World world = player.world;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); return false;
if (chest == null) }
return true;
@Override
if (!anychest) { public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
if (world.s(x, y + 1, z)) EntityPlayer player = ((CraftPlayer) p).getHandle();
return true; World world = player.world;
if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z))) Object chest = world.getTileEntity(x, y, z);
return true; if (chest == null)
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z))) return true;
return true;
if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1))) if (!anychest) {
return true; if (world.s(x, y + 1, z))
if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1))) return true;
return true; if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
} return true;
if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
if (world.getTypeId(x - 1, y, z) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
if (world.getTypeId(x + 1, y, z) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
if (world.getTypeId(x, y, z - 1) == Block.CHEST.id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest); }
if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); if (world.getTypeId(x - 1, y, z) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
boolean returnValue = true; if (world.getTypeId(x + 1, y, z) == Block.CHEST.id)
if (!silentchest) { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
player.openContainer((IInventory) chest); if (world.getTypeId(x, y, z - 1) == Block.CHEST.id)
} chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
else { if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
try { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
int id = 0;
try { boolean returnValue = true;
Field windowID = player.getClass().getDeclaredField("containerCounter"); if (!silentchest) {
windowID.setAccessible(true); player.openContainer((IInventory) chest);
id = windowID.getInt(player); }
id = id % 100 + 1; else {
windowID.setInt(player, id); try {
} int id = 0;
catch (NoSuchFieldException e) {} try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
player.playerConnection.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize())); windowID.setAccessible(true);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); id = windowID.getInt(player);
player.activeContainer.windowId = id; id = id % 100 + 1;
player.activeContainer.addSlotListener(player); windowID.setInt(player, id);
if (OpenInv.NotifySilentChest()) { }
p.sendMessage("You are opening a chest silently."); catch (NoSuchFieldException e) {}
}
returnValue = false; player.playerConnection.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize()));
} player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
catch (Exception e) { player.activeContainer.windowId = id;
e.printStackTrace(); player.activeContainer.addSlotListener(player);
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); returnValue = false;
} }
} catch (Exception e) {
e.printStackTrace();
if (anychest && OpenInv.NotifyAnyChest()) { p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
p.sendMessage("You are opening a blocked chest."); }
} }
return returnValue; return returnValue;
} }
} }

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_R1; package com.lishid.openinv.internal.v1_4_R1;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile import net.minecraft.server.v1_4_R1.IInventory;
import net.minecraft.server.v1_4_R1.*;
import org.bukkit.craftbukkit.v1_4_R1.inventory.*; // Volatile
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,57 @@
/*
* 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 org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
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) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_R1; package com.lishid.openinv.internal.v1_4_R1;
//Volatile // Volatile
import net.minecraft.server.v1_4_R1.*; import net.minecraft.server.v1_4_R1.ContainerChest;
import net.minecraft.server.v1_4_R1.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_4_R1.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.f(); inv = i2;
} // close signal
inv.f();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_R1; package com.lishid.openinv.internal.v1_4_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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; // Volatile
import org.bukkit.inventory.InventoryHolder; import com.lishid.openinv.internal.ISpecialEnderChest;
//Volatile import net.minecraft.server.v1_4_R1.EntityHuman;
import net.minecraft.server.v1_4_R1.*; import net.minecraft.server.v1_4_R1.IInventory;
import org.bukkit.craftbukkit.v1_4_R1.entity.*; import net.minecraft.server.v1_4_R1.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_4_R1.inventory.*; import net.minecraft.server.v1_4_R1.InventorySubcontainer;
import net.minecraft.server.v1_4_R1.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_4_R1.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
} CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} public boolean a(EntityHuman entityhuman) {
} return true;
}
@Override
public void startOpen() {
}
@Override
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_R1; package com.lishid.openinv.internal.v1_4_R1;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
import net.minecraft.server.v1_4_R1.EntityHuman;
//Volatile import net.minecraft.server.v1_4_R1.ItemStack;
import net.minecraft.server.v1_4_R1.*; import net.minecraft.server.v1_4_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_4_R1.entity.*;
import org.bukkit.craftbukkit.v1_4_R1.inventory.*; // Volatile
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack); owner.getHandle().drop(itemstack);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getName() { public String getName() {
if (player.name.length() > 16) { if (player.name.length() > 16) {
return player.name.substring(0, 16); return player.name.substring(0, 16);
} }
return player.name; return player.name;
} }
@Override @Override
public boolean a_(EntityHuman entityhuman) { public boolean a_(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -1,124 +1,123 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R2; package com.lishid.openinv.internal.v1_5_R2;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
// Volatile
//Volatile import net.minecraft.server.v1_5_R2.EntityPlayer;
import net.minecraft.server.v1_5_R2.*; import net.minecraft.server.v1_5_R2.IInventory;
import net.minecraft.server.v1_5_R2.InventoryLargeChest;
import org.bukkit.craftbukkit.v1_5_R2.entity.*; import net.minecraft.server.v1_5_R2.Packet100OpenWindow;
import net.minecraft.server.v1_5_R2.TileEntityChest;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_5_R2.World;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; public class AnySilentChest implements IAnySilentChest {
// If block on top @Override
if (world.t(x, y + 1, z)) public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
return true; // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
int id = world.getTypeId(x, y, z); World world = player.world;
// If block on top
// If block next to chest is chest and has a block on top if (world.t(x, y + 1, z))
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z))) return true;
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z))) int id = world.getTypeId(x, y, z);
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) // If block next to chest is chest and has a block on top
return true; if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) return true;
return true; if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
return false; if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
} return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { return true;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; return false;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); }
if (chest == null)
return true; @Override
public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
int id = world.getTypeId(x, y, z); EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
if (!anychest) { Object chest = world.getTileEntity(x, y, z);
if (world.t(x, y + 1, z)) if (chest == null)
return true; return true;
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; int id = world.getTypeId(x, y, z);
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true; if (!anychest) {
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) if (world.t(x, y + 1, z))
return true; return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; return true;
} if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if (world.getTypeId(x - 1, y, z) == id) if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); return true;
if (world.getTypeId(x + 1, y, z) == id) if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); return true;
if (world.getTypeId(x, y, z - 1) == id) }
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
if (world.getTypeId(x, y, z + 1) == id) if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
boolean returnValue = true; chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
if (!silentchest) { if (world.getTypeId(x, y, z - 1) == id)
player.openContainer((IInventory) chest); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
} if (world.getTypeId(x, y, z + 1) == id)
else { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
try {
int windowId = 0; boolean returnValue = true;
try { if (!silentchest) {
Field windowID = player.getClass().getDeclaredField("containerCounter"); player.openContainer((IInventory) chest);
windowID.setAccessible(true); }
windowId = windowID.getInt(player); else {
windowId = windowId % 100 + 1; try {
windowID.setInt(player, windowId); int windowId = 0;
} try {
catch (NoSuchFieldException e) {} Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true)); windowId = windowID.getInt(player);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); windowId = windowId % 100 + 1;
player.activeContainer.windowId = windowId; windowID.setInt(player, windowId);
player.activeContainer.addSlotListener(player); }
if (OpenInv.NotifySilentChest()) { catch (NoSuchFieldException e) {}
p.sendMessage("You are opening a chest silently.");
} player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
returnValue = false; player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
} player.activeContainer.windowId = windowId;
catch (Exception e) { player.activeContainer.addSlotListener(player);
e.printStackTrace(); returnValue = false;
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); }
} 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;
return returnValue; }
} }
}

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R2; package com.lishid.openinv.internal.v1_5_R2;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_5_R2.*; import net.minecraft.server.v1_5_R2.IInventory;
import org.bukkit.craftbukkit.v1_5_R2.inventory.*;
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,56 @@
/*
* 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 org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// 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) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R2; package com.lishid.openinv.internal.v1_5_R2;
//Volatile // Volatile
import net.minecraft.server.v1_5_R2.*; import net.minecraft.server.v1_5_R2.ContainerChest;
import net.minecraft.server.v1_5_R2.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_5_R2.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.g(); inv = i2;
} // close signal
inv.g();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R2; package com.lishid.openinv.internal.v1_5_R2;
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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_5_R2.EntityHuman;
import net.minecraft.server.v1_5_R2.*; import net.minecraft.server.v1_5_R2.IInventory;
import org.bukkit.craftbukkit.v1_5_R2.entity.*; import net.minecraft.server.v1_5_R2.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_5_R2.inventory.*; import net.minecraft.server.v1_5_R2.InventorySubcontainer;
import net.minecraft.server.v1_5_R2.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_5_R2.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); 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();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} @Override
} public boolean a(EntityHuman entityhuman) {
return true;
}
@Override
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R2; package com.lishid.openinv.internal.v1_5_R2;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_5_R2.EntityHuman;
import net.minecraft.server.v1_5_R2.*; import net.minecraft.server.v1_5_R2.ItemStack;
import org.bukkit.craftbukkit.v1_5_R2.entity.*; import net.minecraft.server.v1_5_R2.PlayerInventory;
import org.bukkit.craftbukkit.v1_5_R2.inventory.*;
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack); owner.getHandle().drop(itemstack);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getName() { public String getName() {
if (player.name.length() > 16) { if (player.name.length() > 16) {
return player.name.substring(0, 16); return player.name.substring(0, 16);
} }
return player.name; return player.name;
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -0,0 +1,123 @@
/*
* 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 org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IAnySilentChest;
//Volatile
import net.minecraft.server.v1_5_R3.EntityPlayer;
import net.minecraft.server.v1_5_R3.IInventory;
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.World;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
public class AnySilentChest implements IAnySilentChest {
@Override
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.t(x, y + 1, z))
return true;
int id = world.getTypeId(x, y, z);
// If block next to chest is chest and has a block on top
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
return true;
return false;
}
@Override
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 = world.getTileEntity(x, y, z);
if (chest == null)
return true;
int id = world.getTypeId(x, y, z);
if (!anychest) {
if (world.t(x, y + 1, z))
return true;
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
return true;
}
if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
if (world.getTypeId(x, y, z - 1) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
if (world.getTypeId(x, y, z + 1) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
boolean returnValue = true;
if (!silentchest) {
player.openContainer((IInventory) chest);
}
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) chest).getName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = false;
}
catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
}
return returnValue;
}
}

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R3; package com.lishid.openinv.internal.v1_5_R3;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_5_R3.*; import net.minecraft.server.v1_5_R3.IInventory;
import org.bukkit.craftbukkit.v1_5_R3.inventory.*;
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,56 @@
/*
* 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 org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// 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) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R3; package com.lishid.openinv.internal.v1_5_R3;
//Volatile // Volatile
import net.minecraft.server.v1_5_R3.*; import net.minecraft.server.v1_5_R3.ContainerChest;
import net.minecraft.server.v1_5_R3.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_5_R3.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.g(); inv = i2;
} // close signal
inv.g();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R3; package com.lishid.openinv.internal.v1_5_R3;
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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_5_R3.EntityHuman;
import net.minecraft.server.v1_5_R3.*; import net.minecraft.server.v1_5_R3.IInventory;
import org.bukkit.craftbukkit.v1_5_R3.entity.*; import net.minecraft.server.v1_5_R3.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_5_R3.inventory.*; import net.minecraft.server.v1_5_R3.InventorySubcontainer;
import net.minecraft.server.v1_5_R3.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_5_R3.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); 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();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} @Override
} public boolean a(EntityHuman entityhuman) {
return true;
}
@Override
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_5_R3; package com.lishid.openinv.internal.v1_5_R3;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_5_R3.EntityHuman;
import net.minecraft.server.v1_5_R3.*; import net.minecraft.server.v1_5_R3.ItemStack;
import org.bukkit.craftbukkit.v1_5_R3.entity.*; import net.minecraft.server.v1_5_R3.PlayerInventory;
import org.bukkit.craftbukkit.v1_5_R3.inventory.*;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack); owner.getHandle().drop(itemstack);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getName() { public String getName() {
if (player.name.length() > 16) { if (player.name.length() > 16) {
return player.name.substring(0, 16); return player.name.substring(0, 16);
} }
return player.name; return player.name;
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -1,124 +1,123 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R1; package com.lishid.openinv.internal.v1_6_R1;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
// Volatile
//Volatile import net.minecraft.server.v1_6_R1.EntityPlayer;
import net.minecraft.server.v1_6_R1.*; import net.minecraft.server.v1_6_R1.IInventory;
import net.minecraft.server.v1_6_R1.InventoryLargeChest;
import org.bukkit.craftbukkit.v1_6_R1.entity.*; import net.minecraft.server.v1_6_R1.Packet100OpenWindow;
import net.minecraft.server.v1_6_R1.TileEntityChest;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_6_R1.World;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; public class AnySilentChest implements IAnySilentChest {
// If block on top @Override
if (world.t(x, y + 1, z)) public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
return true; // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
int id = world.getTypeId(x, y, z); World world = player.world;
// If block on top
// If block next to chest is chest and has a block on top if (world.t(x, y + 1, z))
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z))) return true;
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z))) int id = world.getTypeId(x, y, z);
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) // If block next to chest is chest and has a block on top
return true; if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) return true;
return true; if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
return false; if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
} return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { return true;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; return false;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); }
if (chest == null)
return true; @Override
public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
int id = world.getTypeId(x, y, z); EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
if (!anychest) { Object chest = world.getTileEntity(x, y, z);
if (world.t(x, y + 1, z)) if (chest == null)
return true; return true;
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; int id = world.getTypeId(x, y, z);
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true; if (!anychest) {
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) if (world.t(x, y + 1, z))
return true; return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; return true;
} if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if (world.getTypeId(x - 1, y, z) == id) if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); return true;
if (world.getTypeId(x + 1, y, z) == id) if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); return true;
if (world.getTypeId(x, y, z - 1) == id) }
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
if (world.getTypeId(x, y, z + 1) == id) if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
boolean returnValue = true; chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
if (!silentchest) { if (world.getTypeId(x, y, z - 1) == id)
player.openContainer((IInventory) chest); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
} if (world.getTypeId(x, y, z + 1) == id)
else { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
try {
int windowId = 0; boolean returnValue = true;
try { if (!silentchest) {
Field windowID = player.getClass().getDeclaredField("containerCounter"); player.openContainer((IInventory) chest);
windowID.setAccessible(true); }
windowId = windowID.getInt(player); else {
windowId = windowId % 100 + 1; try {
windowID.setInt(player, windowId); int windowId = 0;
} try {
catch (NoSuchFieldException e) {} Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true)); windowId = windowID.getInt(player);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); windowId = windowId % 100 + 1;
player.activeContainer.windowId = windowId; windowID.setInt(player, windowId);
player.activeContainer.addSlotListener(player); }
if (OpenInv.NotifySilentChest()) { catch (NoSuchFieldException e) {}
p.sendMessage("You are opening a chest silently.");
} player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
returnValue = false; player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
} player.activeContainer.windowId = windowId;
catch (Exception e) { player.activeContainer.addSlotListener(player);
e.printStackTrace(); returnValue = false;
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); }
} 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;
return returnValue; }
} }
}

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R1; package com.lishid.openinv.internal.v1_6_R1;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_6_R1.*; import net.minecraft.server.v1_6_R1.IInventory;
import org.bukkit.craftbukkit.v1_6_R1.inventory.*;
import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,56 @@
/*
* 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 org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// 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) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R1; package com.lishid.openinv.internal.v1_6_R1;
//Volatile // Volatile
import net.minecraft.server.v1_6_R1.*; import net.minecraft.server.v1_6_R1.ContainerChest;
import net.minecraft.server.v1_6_R1.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_6_R1.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.g(); inv = i2;
} // close signal
inv.g();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R1; package com.lishid.openinv.internal.v1_6_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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_6_R1.EntityHuman;
import net.minecraft.server.v1_6_R1.*; import net.minecraft.server.v1_6_R1.IInventory;
import org.bukkit.craftbukkit.v1_6_R1.entity.*; import net.minecraft.server.v1_6_R1.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_6_R1.inventory.*; import net.minecraft.server.v1_6_R1.InventorySubcontainer;
import net.minecraft.server.v1_6_R1.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_6_R1.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); 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();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} @Override
} public boolean a(EntityHuman entityhuman) {
return true;
}
@Override
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,254 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R1; package com.lishid.openinv.internal.v1_6_R1;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_6_R1.EntityHuman;
import net.minecraft.server.v1_6_R1.*; import net.minecraft.server.v1_6_R1.ItemStack;
import org.bukkit.craftbukkit.v1_6_R1.entity.*; import net.minecraft.server.v1_6_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_6_R1.inventory.*;
import org.bukkit.craftbukkit.v1_6_R1.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5];
private CraftInventory inventory = new CraftInventory(this); public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
CraftPlayer owner;
public SpecialPlayerInventory(Player p, Boolean online) { public boolean playerOnline = false;
super(((CraftPlayer) p).getHandle()); private final ItemStack[] extra = new ItemStack[5];
this.owner = ((CraftPlayer) p); private final CraftInventory inventory = new CraftInventory(this);
this.playerOnline = online;
this.items = player.inventory.items; public SpecialPlayerInventory(Player p, Boolean online) {
this.armor = player.inventory.armor; super(((CraftPlayer) p).getHandle());
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.owner = ((CraftPlayer) p);
} this.playerOnline = online;
this.items = player.inventory.items;
@Override this.armor = player.inventory.armor;
public Inventory getBukkitInventory() { }
return inventory;
} @Override
public Inventory getBukkitInventory() {
@Override return inventory;
public void InventoryRemovalCheck() { }
owner.saveData();
if (transaction.isEmpty() && !playerOnline) { @Override
OpenInv.inventories.remove(owner.getName().toLowerCase()); public boolean inventoryRemovalCheck() {
} owner.saveData();
} return transaction.isEmpty() && !playerOnline;
}
@Override
public void PlayerGoOnline(Player player) { @Override
if (!playerOnline) { public void setPlayerOnline(Player player) {
CraftPlayer p = (CraftPlayer) player; if (!playerOnline) {
p.getHandle().inventory.items = this.items; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.items = this.items;
p.saveData(); p.getHandle().inventory.armor = this.armor;
playerOnline = true; p.saveData();
} playerOnline = true;
} }
}
@Override
public void PlayerGoOffline() { @Override
playerOnline = false; public boolean setPlayerOffline() {
this.InventoryRemovalCheck(); playerOnline = false;
} return this.inventoryRemovalCheck();
}
@Override
public void onClose(CraftHumanEntity who) { @Override
super.onClose(who); public void onClose(CraftHumanEntity who) {
this.InventoryRemovalCheck(); super.onClose(who);
} this.inventoryRemovalCheck();
}
@Override
public ItemStack[] getContents() { @Override
ItemStack[] C = new ItemStack[getSize()]; public ItemStack[] getContents() {
System.arraycopy(items, 0, C, 0, items.length); ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, 0, items.length);
return C; System.arraycopy(items, 0, C, items.length, armor.length);
} return C;
}
@Override
public int getSize() { @Override
return super.getSize() + 5; public int getSize() {
} return super.getSize() + 5;
}
@Override
public ItemStack getItem(int i) { @Override
ItemStack[] is = this.items; public ItemStack getItem(int i) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.armor; i -= is.length;
} is = this.armor;
else { }
i = getReversedItemSlotNum(i); else {
} i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.extra; i -= is.length;
} is = this.extra;
else if (is == this.armor) { }
i = getReversedArmorSlotNum(i); else if (is == this.armor) {
} i = getReversedArmorSlotNum(i);
}
return is[i];
} return is[i];
}
@Override
public ItemStack splitStack(int i, int j) { @Override
ItemStack[] is = this.items; public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.armor; i -= is.length;
} is = this.armor;
else { }
i = getReversedItemSlotNum(i); else {
} i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.extra; i -= is.length;
} is = this.extra;
else if (is == this.armor) { }
i = getReversedArmorSlotNum(i); else if (is == this.armor) {
} i = getReversedArmorSlotNum(i);
}
if (is[i] != null) {
ItemStack itemstack; if (is[i] != null) {
ItemStack itemstack;
if (is[i].count <= j) {
itemstack = is[i]; if (is[i].count <= j) {
is[i] = null; itemstack = is[i];
return itemstack; is[i] = null;
} return itemstack;
else { }
itemstack = is[i].a(j); else {
if (is[i].count == 0) { itemstack = is[i].a(j);
is[i] = null; if (is[i].count == 0) {
} is[i] = null;
}
return itemstack;
} return itemstack;
} }
else { }
return null; else {
} return null;
} }
}
@Override
public ItemStack splitWithoutUpdate(int i) { @Override
ItemStack[] is = this.items; public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.armor; i -= is.length;
} is = this.armor;
else { }
i = getReversedItemSlotNum(i); else {
} i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.extra; i -= is.length;
} is = this.extra;
else if (is == this.armor) { }
i = getReversedArmorSlotNum(i); else if (is == this.armor) {
} i = getReversedArmorSlotNum(i);
}
if (is[i] != null) {
ItemStack itemstack = is[i]; if (is[i] != null) {
ItemStack itemstack = is[i];
is[i] = null;
return itemstack; is[i] = null;
} return itemstack;
else { }
return null; else {
} return null;
} }
}
@Override
public void setItem(int i, ItemStack itemstack) { @Override
ItemStack[] is = this.items; public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items;
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.armor; i -= is.length;
} is = this.armor;
else { }
i = getReversedItemSlotNum(i); else {
} i = getReversedItemSlotNum(i);
}
if (i >= is.length) {
i -= is.length; if (i >= is.length) {
is = this.extra; i -= is.length;
} is = this.extra;
else if (is == this.armor) { }
i = getReversedArmorSlotNum(i); else if (is == this.armor) {
} i = getReversedArmorSlotNum(i);
}
// Effects
if (is == this.extra) { // Effects
owner.getHandle().drop(itemstack); if (is == this.extra) {
itemstack = null; owner.getHandle().drop(itemstack);
} itemstack = null;
}
is[i] = itemstack;
is[i] = itemstack;
owner.getHandle().defaultContainer.b();
} owner.getHandle().defaultContainer.b();
}
private int getReversedItemSlotNum(int i) {
if (i >= 27) private int getReversedItemSlotNum(int i) {
return i - 27; if (i >= 27)
else return i - 27;
return i + 9; else
} return i + 9;
}
private int getReversedArmorSlotNum(int i) {
if (i == 0) private int getReversedArmorSlotNum(int i) {
return 3; if (i == 0)
if (i == 1) return 3;
return 2; if (i == 1)
if (i == 2) return 2;
return 1; if (i == 2)
if (i == 3) return 1;
return 0; if (i == 3)
else return 0;
return i; else
} return i;
}
@Override
public String getName() { @Override
if (player.getName().length() > 16) { public String getName() {
return player.getName().substring(0, 16); if (player.getName().length() > 16) {
} return player.getName().substring(0, 16);
return player.getName(); }
} return player.getName();
}
@Override
public boolean a(EntityHuman entityhuman) { @Override
return true; public boolean a(EntityHuman entityhuman) {
} return true;
} }
}

View File

@@ -1,124 +1,123 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R2; package com.lishid.openinv.internal.v1_6_R2;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
// Volatile
//Volatile import net.minecraft.server.v1_6_R2.EntityPlayer;
import net.minecraft.server.v1_6_R2.*; import net.minecraft.server.v1_6_R2.IInventory;
import net.minecraft.server.v1_6_R2.InventoryLargeChest;
import org.bukkit.craftbukkit.v1_6_R2.entity.*; import net.minecraft.server.v1_6_R2.Packet100OpenWindow;
import net.minecraft.server.v1_6_R2.TileEntityChest;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_6_R2.World;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; public class AnySilentChest implements IAnySilentChest {
// If block on top @Override
if (world.t(x, y + 1, z)) public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
return true; // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
int id = world.getTypeId(x, y, z); World world = player.world;
// If block on top
// If block next to chest is chest and has a block on top if (world.t(x, y + 1, z))
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z))) return true;
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z))) int id = world.getTypeId(x, y, z);
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) // If block next to chest is chest and has a block on top
return true; if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) return true;
return true; if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
return false; if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
} return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { return true;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; return false;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); }
if (chest == null)
return true; @Override
public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
int id = world.getTypeId(x, y, z); EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
if (!anychest) { Object chest = world.getTileEntity(x, y, z);
if (world.t(x, y + 1, z)) if (chest == null)
return true; return true;
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; int id = world.getTypeId(x, y, z);
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true; if (!anychest) {
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) if (world.t(x, y + 1, z))
return true; return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; return true;
} if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if (world.getTypeId(x - 1, y, z) == id) if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); return true;
if (world.getTypeId(x + 1, y, z) == id) if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); return true;
if (world.getTypeId(x, y, z - 1) == id) }
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
if (world.getTypeId(x, y, z + 1) == id) if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
boolean returnValue = true; chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
if (!silentchest) { if (world.getTypeId(x, y, z - 1) == id)
player.openContainer((IInventory) chest); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
} if (world.getTypeId(x, y, z + 1) == id)
else { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
try {
int windowId = 0; boolean returnValue = true;
try { if (!silentchest) {
Field windowID = player.getClass().getDeclaredField("containerCounter"); player.openContainer((IInventory) chest);
windowID.setAccessible(true); }
windowId = windowID.getInt(player); else {
windowId = windowId % 100 + 1; try {
windowID.setInt(player, windowId); int windowId = 0;
} try {
catch (NoSuchFieldException e) {} Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true)); windowId = windowID.getInt(player);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); windowId = windowId % 100 + 1;
player.activeContainer.windowId = windowId; windowID.setInt(player, windowId);
player.activeContainer.addSlotListener(player); }
if (OpenInv.NotifySilentChest()) { catch (NoSuchFieldException e) {}
p.sendMessage("You are opening a chest silently.");
} player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
returnValue = false; player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
} player.activeContainer.windowId = windowId;
catch (Exception e) { player.activeContainer.addSlotListener(player);
e.printStackTrace(); returnValue = false;
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); }
} 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;
return returnValue; }
} }
}

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R2; package com.lishid.openinv.internal.v1_6_R2;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_6_R2.*; import net.minecraft.server.v1_6_R2.IInventory;
import org.bukkit.craftbukkit.v1_6_R2.inventory.*;
import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,56 @@
/*
* 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_R2;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile
import net.minecraft.server.v1_6_R2.EntityPlayer;
import net.minecraft.server.v1_6_R2.MinecraftServer;
import net.minecraft.server.v1_6_R2.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R2.CraftServer;
public class PlayerDataManager implements IPlayerDataManager {
@Override
public Player loadPlayer(OfflinePlayer offline) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R2; package com.lishid.openinv.internal.v1_6_R2;
//Volatile // Volatile
import net.minecraft.server.v1_6_R2.*; import net.minecraft.server.v1_6_R2.ContainerChest;
import net.minecraft.server.v1_6_R2.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_6_R2.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.g(); inv = i2;
} // close signal
inv.g();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R2; package com.lishid.openinv.internal.v1_6_R2;
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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_6_R2.EntityHuman;
import net.minecraft.server.v1_6_R2.*; import net.minecraft.server.v1_6_R2.IInventory;
import org.bukkit.craftbukkit.v1_6_R2.entity.*; import net.minecraft.server.v1_6_R2.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_6_R2.inventory.*; import net.minecraft.server.v1_6_R2.InventorySubcontainer;
import net.minecraft.server.v1_6_R2.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_6_R2.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); 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();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} @Override
} public boolean a(EntityHuman entityhuman) {
return true;
}
@Override
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R2; package com.lishid.openinv.internal.v1_6_R2;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_6_R2.EntityHuman;
import net.minecraft.server.v1_6_R2.*; import net.minecraft.server.v1_6_R2.ItemStack;
import org.bukkit.craftbukkit.v1_6_R2.entity.*; import net.minecraft.server.v1_6_R2.PlayerInventory;
import org.bukkit.craftbukkit.v1_6_R2.inventory.*;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack); owner.getHandle().drop(itemstack);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getName() { public String getName() {
if (player.getName().length() > 16) { if (player.getName().length() > 16) {
return player.getName().substring(0, 16); return player.getName().substring(0, 16);
} }
return player.getName(); return player.getName();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -1,124 +1,123 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R3; package com.lishid.openinv.internal.v1_6_R3;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
// Volatile
//Volatile import net.minecraft.server.v1_6_R3.EntityPlayer;
import net.minecraft.server.v1_6_R3.*; import net.minecraft.server.v1_6_R3.IInventory;
import net.minecraft.server.v1_6_R3.InventoryLargeChest;
import org.bukkit.craftbukkit.v1_6_R3.entity.*; import net.minecraft.server.v1_6_R3.Packet100OpenWindow;
import net.minecraft.server.v1_6_R3.TileEntityChest;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_6_R3.World;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; public class AnySilentChest implements IAnySilentChest {
// If block on top @Override
if (world.t(x, y + 1, z)) public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
return true; // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
int id = world.getTypeId(x, y, z); World world = player.world;
// If block on top
// If block next to chest is chest and has a block on top if (world.t(x, y + 1, z))
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z))) return true;
return true;
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z))) int id = world.getTypeId(x, y, z);
return true;
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) // If block next to chest is chest and has a block on top
return true; if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) return true;
return true; if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
return false; if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
} return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { return true;
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world; return false;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); }
if (chest == null)
return true; @Override
public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
int id = world.getTypeId(x, y, z); EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
if (!anychest) { Object chest = world.getTileEntity(x, y, z);
if (world.t(x, y + 1, z)) if (chest == null)
return true; return true;
if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; int id = world.getTypeId(x, y, z);
if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true; if (!anychest) {
if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1))) if (world.t(x, y + 1, z))
return true; return true;
if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1))) if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
return true; return true;
} if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
return true;
if (world.getTypeId(x - 1, y, z) == id) if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); return true;
if (world.getTypeId(x + 1, y, z) == id) if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); return true;
if (world.getTypeId(x, y, z - 1) == id) }
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
if (world.getTypeId(x, y, z + 1) == id) if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
boolean returnValue = true; chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
if (!silentchest) { if (world.getTypeId(x, y, z - 1) == id)
player.openContainer((IInventory) chest); chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
} if (world.getTypeId(x, y, z + 1) == id)
else { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
try {
int windowId = 0; boolean returnValue = true;
try { if (!silentchest) {
Field windowID = player.getClass().getDeclaredField("containerCounter"); player.openContainer((IInventory) chest);
windowID.setAccessible(true); }
windowId = windowID.getInt(player); else {
windowId = windowId % 100 + 1; try {
windowID.setInt(player, windowId); int windowId = 0;
} try {
catch (NoSuchFieldException e) {} Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true)); windowId = windowID.getInt(player);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); windowId = windowId % 100 + 1;
player.activeContainer.windowId = windowId; windowID.setInt(player, windowId);
player.activeContainer.addSlotListener(player); }
if (OpenInv.NotifySilentChest()) { catch (NoSuchFieldException e) {}
p.sendMessage("You are opening a chest silently.");
} player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
returnValue = false; player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
} player.activeContainer.windowId = windowId;
catch (Exception e) { player.activeContainer.addSlotListener(player);
e.printStackTrace(); returnValue = false;
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); }
} 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;
return returnValue; }
} }
}

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R3; package com.lishid.openinv.internal.v1_6_R3;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_6_R3.*; import net.minecraft.server.v1_6_R3.IInventory;
import org.bukkit.craftbukkit.v1_6_R3.inventory.*;
import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,56 @@
/*
* 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_R3;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile
import net.minecraft.server.v1_6_R3.EntityPlayer;
import net.minecraft.server.v1_6_R3.MinecraftServer;
import net.minecraft.server.v1_6_R3.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R3.CraftServer;
public class PlayerDataManager implements IPlayerDataManager {
@Override
public Player loadPlayer(OfflinePlayer offline) {
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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R3; package com.lishid.openinv.internal.v1_6_R3;
//Volatile // Volatile
import net.minecraft.server.v1_6_R3.*; import net.minecraft.server.v1_6_R3.ContainerChest;
import net.minecraft.server.v1_6_R3.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_6_R3.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.g(); inv = i2;
} // close signal
inv.g();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R3; package com.lishid.openinv.internal.v1_6_R3;
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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_6_R3.EntityHuman;
import net.minecraft.server.v1_6_R3.*; import net.minecraft.server.v1_6_R3.IInventory;
import org.bukkit.craftbukkit.v1_6_R3.entity.*; import net.minecraft.server.v1_6_R3.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_6_R3.inventory.*; import net.minecraft.server.v1_6_R3.InventorySubcontainer;
import net.minecraft.server.v1_6_R3.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_6_R3.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), ((CraftPlayer) p).getHandle().getEnderChest().c(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); 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();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} @Override
} public boolean a(EntityHuman entityhuman) {
return true;
}
@Override
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_6_R3; package com.lishid.openinv.internal.v1_6_R3;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_6_R3.EntityHuman;
import net.minecraft.server.v1_6_R3.*; import net.minecraft.server.v1_6_R3.ItemStack;
import org.bukkit.craftbukkit.v1_6_R3.entity.*; import net.minecraft.server.v1_6_R3.PlayerInventory;
import org.bukkit.craftbukkit.v1_6_R3.inventory.*;
import org.bukkit.craftbukkit.v1_6_R3.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack); owner.getHandle().drop(itemstack);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getName() { public String getName() {
if (player.getName().length() > 16) { if (player.getName().length() > 16) {
return player.getName().substring(0, 16); return player.getName().substring(0, 16);
} }
return player.getName(); return player.getName();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -1,124 +1,124 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R1; package com.lishid.openinv.internal.v1_7_R1;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
//Volatile
//Volatile import net.minecraft.server.v1_7_R1.Block;
import net.minecraft.server.v1_7_R1.*; import net.minecraft.server.v1_7_R1.EntityPlayer;
import net.minecraft.server.v1_7_R1.IInventory;
import org.bukkit.craftbukkit.v1_7_R1.entity.*; import net.minecraft.server.v1_7_R1.InventoryLargeChest;
import net.minecraft.server.v1_7_R1.PacketPlayOutOpenWindow;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_7_R1.TileEntityChest;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) { import net.minecraft.server.v1_7_R1.World;
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
World world = player.world;
// If block on top public class AnySilentChest implements IAnySilentChest {
if (world.getType(x, y + 1, z).c()) @Override
return true; public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
int id = Block.b(world.getType(x, y, z)); EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
// If block next to chest is chest and has a block on top // If block on top
if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c())) if (world.getType(x, y + 1, z).c())
return true; return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
return true; int id = Block.b(world.getType(x, y, z));
if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
return true; // If block next to chest is chest and has a block on top
if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c())) if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
return true; return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
return false; return true;
} if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
return true;
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
EntityPlayer player = ((CraftPlayer) p).getHandle(); return true;
World world = player.world;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); return false;
if (chest == null) }
return true;
@Override
int id = Block.b(world.getType(x, y, z)); public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
if (!anychest) { World world = player.world;
if (world.getType(x, y + 1, z).c()) Object chest = world.getTileEntity(x, y, z);
return true; if (chest == null)
if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c())) return true;
return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c())) int id = Block.b(world.getType(x, y, z));
return true;
if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c())) if (!anychest) {
return true; if (world.getType(x, y + 1, z).c())
if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c())) return true;
return true; if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
} return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
if (Block.b(world.getType(x - 1, y, z)) == id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
if (Block.b(world.getType(x + 1, y, z)) == id) return true;
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
if (Block.b(world.getType(x, y, z - 1)) == id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest); }
if (Block.b(world.getType(x, y, z + 1)) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); if (Block.b(world.getType(x - 1, y, z)) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
boolean returnValue = true; if (Block.b(world.getType(x + 1, y, z)) == id)
if (!silentchest) { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
player.openContainer((IInventory) chest); if (Block.b(world.getType(x, y, z - 1)) == id)
} chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
else { if (Block.b(world.getType(x, y, z + 1)) == id)
try { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
int windowId = 0;
try { boolean returnValue = true;
Field windowID = player.getClass().getDeclaredField("containerCounter"); if (!silentchest) {
windowID.setAccessible(true); player.openContainer((IInventory) chest);
windowId = windowID.getInt(player); }
windowId = windowId % 100 + 1; else {
windowID.setInt(player, windowId); try {
} int windowId = 0;
catch (NoSuchFieldException e) {} try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true)); windowID.setAccessible(true);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); windowId = windowID.getInt(player);
player.activeContainer.windowId = windowId; windowId = windowId % 100 + 1;
player.activeContainer.addSlotListener(player); windowID.setInt(player, windowId);
if (OpenInv.NotifySilentChest()) { }
p.sendMessage("You are opening a chest silently."); catch (NoSuchFieldException e) {}
}
returnValue = false; player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true));
} player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
catch (Exception e) { player.activeContainer.windowId = windowId;
e.printStackTrace(); player.activeContainer.addSlotListener(player);
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); returnValue = false;
} }
} catch (Exception e) {
e.printStackTrace();
if (anychest && OpenInv.NotifyAnyChest()) { p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
p.sendMessage("You are opening a blocked chest."); }
} }
return returnValue; return returnValue;
} }
} }

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R1; package com.lishid.openinv.internal.v1_7_R1;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_7_R1.*; import net.minecraft.server.v1_7_R1.IInventory;
import org.bukkit.craftbukkit.v1_7_R1.inventory.*;
import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,58 @@
/*
* 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_7_R1;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
// Volatile
import net.minecraft.server.v1_7_R1.EntityPlayer;
import net.minecraft.server.v1_7_R1.MinecraftServer;
import net.minecraft.server.v1_7_R1.PlayerInteractManager;
import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R1.CraftServer;
public class PlayerDataManager implements IPlayerDataManager {
@Override
public Player loadPlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(null, offline.getName());
// 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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R1; package com.lishid.openinv.internal.v1_7_R1;
//Volatile // Volatile
import net.minecraft.server.v1_7_R1.*; import net.minecraft.server.v1_7_R1.ContainerChest;
import net.minecraft.server.v1_7_R1.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_7_R1.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.l_(); inv = i2;
} // close signal
inv.l_();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R1; package com.lishid.openinv.internal.v1_7_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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_7_R1.EntityHuman;
import net.minecraft.server.v1_7_R1.*; import net.minecraft.server.v1_7_R1.IInventory;
import org.bukkit.craftbukkit.v1_7_R1.entity.*; import net.minecraft.server.v1_7_R1.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_7_R1.inventory.*; import net.minecraft.server.v1_7_R1.InventorySubcontainer;
import net.minecraft.server.v1_7_R1.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_7_R1.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
} CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} @Override
} public boolean a(EntityHuman entityhuman) {
return true;
}
@Override
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R1; package com.lishid.openinv.internal.v1_7_R1;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_7_R1.EntityHuman;
import net.minecraft.server.v1_7_R1.*; import net.minecraft.server.v1_7_R1.ItemStack;
import org.bukkit.craftbukkit.v1_7_R1.entity.*; import net.minecraft.server.v1_7_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_7_R1.inventory.*;
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack, true); owner.getHandle().drop(itemstack, true);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getInventoryName() { public String getInventoryName() {
if (player.getName().length() > 16) { if (player.getName().length() > 16) {
return player.getName().substring(0, 16); return player.getName().substring(0, 16);
} }
return player.getName(); return player.getName();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return true; return true;
} }
} }

View File

@@ -1,124 +1,124 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R2; package com.lishid.openinv.internal.v1_7_R2;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.IAnySilentChest;
import com.lishid.openinv.internal.IAnySilentChest;
import net.minecraft.server.v1_7_R2.Block;
//Volatile //Volatile
import net.minecraft.server.v1_7_R2.*; import net.minecraft.server.v1_7_R2.EntityPlayer;
import net.minecraft.server.v1_7_R2.IInventory;
import org.bukkit.craftbukkit.v1_7_R2.entity.*; import net.minecraft.server.v1_7_R2.InventoryLargeChest;
import net.minecraft.server.v1_7_R2.PacketPlayOutOpenWindow;
public class AnySilentChest implements IAnySilentChest { import net.minecraft.server.v1_7_R2.TileEntityChest;
public boolean IsAnyChestNeeded(Player p, int x, int y, int z) { import net.minecraft.server.v1_7_R2.World;
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;
World world = player.world;
// If block on top public class AnySilentChest implements IAnySilentChest {
if (world.getType(x, y + 1, z).c()) @Override
return true; public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
int id = Block.b(world.getType(x, y, z)); EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
// If block next to chest is chest and has a block on top // If block on top
if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c())) if (world.getType(x, y + 1, z).c())
return true; return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
return true; int id = Block.b(world.getType(x, y, z));
if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
return true; // If block next to chest is chest and has a block on top
if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c())) if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
return true; return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
return false; return true;
} if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
return true;
public boolean ActivateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) { if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
EntityPlayer player = ((CraftPlayer) p).getHandle(); return true;
World world = player.world;
Object chest = (TileEntityChest) world.getTileEntity(x, y, z); return false;
if (chest == null) }
return true;
@Override
int id = Block.b(world.getType(x, y, z)); public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
if (!anychest) { World world = player.world;
if (world.getType(x, y + 1, z).c()) Object chest = world.getTileEntity(x, y, z);
return true; if (chest == null)
if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c())) return true;
return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c())) int id = Block.b(world.getType(x, y, z));
return true;
if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c())) if (!anychest) {
return true; if (world.getType(x, y + 1, z).c())
if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c())) return true;
return true; if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
} return true;
if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
if (Block.b(world.getType(x - 1, y, z)) == id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest); if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
if (Block.b(world.getType(x + 1, y, z)) == id) return true;
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z)); if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
if (Block.b(world.getType(x, y, z - 1)) == id) return true;
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest); }
if (Block.b(world.getType(x, y, z + 1)) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1)); if (Block.b(world.getType(x - 1, y, z)) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
boolean returnValue = true; if (Block.b(world.getType(x + 1, y, z)) == id)
if (!silentchest) { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x + 1, y, z));
player.openContainer((IInventory) chest); if (Block.b(world.getType(x, y, z - 1)) == id)
} chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x, y, z - 1), (IInventory) chest);
else { if (Block.b(world.getType(x, y, z + 1)) == id)
try { chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
int windowId = 0;
try { boolean returnValue = true;
Field windowID = player.getClass().getDeclaredField("containerCounter"); if (!silentchest) {
windowID.setAccessible(true); player.openContainer((IInventory) chest);
windowId = windowID.getInt(player); }
windowId = windowId % 100 + 1; else {
windowID.setInt(player, windowId); try {
} int windowId = 0;
catch (NoSuchFieldException e) {} try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true)); windowID.setAccessible(true);
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest)); windowId = windowID.getInt(player);
player.activeContainer.windowId = windowId; windowId = windowId % 100 + 1;
player.activeContainer.addSlotListener(player); windowID.setInt(player, windowId);
if (OpenInv.NotifySilentChest()) { }
p.sendMessage("You are opening a chest silently."); catch (NoSuchFieldException e) {}
}
returnValue = false; player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true));
} player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
catch (Exception e) { player.activeContainer.windowId = windowId;
e.printStackTrace(); player.activeContainer.addSlotListener(player);
p.sendMessage(ChatColor.RED + "Error while sending silent chest."); returnValue = false;
} }
} catch (Exception e) {
e.printStackTrace();
if (anychest && OpenInv.NotifyAnyChest()) { p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
p.sendMessage("You are opening a blocked chest."); }
} }
return returnValue; return returnValue;
} }
} }

View File

@@ -1,48 +1,50 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R2; package com.lishid.openinv.internal.v1_7_R2;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions; import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
//Volatile // Volatile
import net.minecraft.server.v1_7_R2.*; import net.minecraft.server.v1_7_R2.IInventory;
import org.bukkit.craftbukkit.v1_7_R2.inventory.*;
import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
public boolean check(Inventory inventory, HumanEntity player) { public class InventoryAccess implements IInventoryAccess {
IInventory inv = ((CraftInventory) inventory).getInventory(); @Override
public boolean check(Inventory inventory, HumanEntity player) {
if (inv instanceof SpecialPlayerInventory) { IInventory inv = ((CraftInventory) inventory).getInventory();
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false; 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; else if (inv instanceof SpecialEnderChest) {
} if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
} return false;
}
return true; }
}
} return true;
}
}

View File

@@ -0,0 +1,58 @@
/*
* 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_7_R2;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.lishid.openinv.internal.IPlayerDataManager;
//Volatile
import net.minecraft.server.v1_7_R2.EntityPlayer;
import net.minecraft.server.v1_7_R2.MinecraftServer;
import net.minecraft.server.v1_7_R2.PlayerInteractManager;
import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R2.CraftServer;
public class PlayerDataManager implements IPlayerDataManager {
@Override
public Player loadPlayer(OfflinePlayer offline) {
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
GameProfile profile = new GameProfile(null, offline.getName());
// 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;
}
return null;
}
@Override
public String getPlayerDataID(OfflinePlayer player) {
return player.getName();
}
}

View File

@@ -1,36 +1,38 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R2; package com.lishid.openinv.internal.v1_7_R2;
//Volatile // Volatile
import net.minecraft.server.v1_7_R2.*; import net.minecraft.server.v1_7_R2.ContainerChest;
import net.minecraft.server.v1_7_R2.EntityHuman;
public class SilentContainerChest extends ContainerChest { import net.minecraft.server.v1_7_R2.IInventory;
public IInventory inv;
public class SilentContainerChest extends ContainerChest {
public SilentContainerChest(IInventory i1, IInventory i2) { public IInventory inv;
super(i1, i2);
inv = i2; public SilentContainerChest(IInventory i1, IInventory i2) {
// close signal super(i1, i2);
inv.l_(); inv = i2;
} // close signal
inv.l_();
@Override }
public void b(EntityHuman paramEntityHuman) {
// Don't send close signal twice, might screw up @Override
} public void b(EntityHuman paramEntityHuman) {
} // Don't send close signal twice, might screw up
}
}

View File

@@ -1,126 +1,143 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R2; package com.lishid.openinv.internal.v1_7_R2;
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 org.bukkit.entity.HumanEntity;
import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.inventory.InventoryHolder;
// Volatile
//Volatile import net.minecraft.server.v1_7_R2.EntityHuman;
import net.minecraft.server.v1_7_R2.*; import net.minecraft.server.v1_7_R2.IInventory;
import org.bukkit.craftbukkit.v1_7_R2.entity.*; import net.minecraft.server.v1_7_R2.InventoryEnderChest;
import org.bukkit.craftbukkit.v1_7_R2.inventory.*; import net.minecraft.server.v1_7_R2.InventorySubcontainer;
import net.minecraft.server.v1_7_R2.ItemStack;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
public List<HumanEntity> transaction = new ArrayList<HumanEntity>(); import org.bukkit.craftbukkit.v1_7_R2.entity.CraftHumanEntity;
public boolean playerOnline = false; import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;
private CraftPlayer owner; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory;
private InventoryEnderChest enderChest;
private int maxStack = MAX_STACK; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
private CraftInventory inventory = new CraftInventory(this); public List<HumanEntity> transaction = new ArrayList<HumanEntity>();
public boolean playerOnline = false;
public SpecialEnderChest(Player p, Boolean online) { private final CraftPlayer owner;
super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize()); private final InventoryEnderChest enderChest;
CraftPlayer player = (CraftPlayer) p; private int maxStack = MAX_STACK;
this.enderChest = player.getHandle().getEnderChest(); private final CraftInventory inventory = new CraftInventory(this);
this.owner = player;
this.items = enderChest.getContents(); public SpecialEnderChest(Player p, Boolean online) {
OpenInv.enderChests.put(owner.getName().toLowerCase(), this); super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), ((CraftPlayer) p).getHandle().getEnderChest().k_(), ((CraftPlayer) p).getHandle().getEnderChest().getSize());
} CraftPlayer player = (CraftPlayer) p;
this.enderChest = player.getHandle().getEnderChest();
public Inventory getBukkitInventory() { this.owner = player;
return inventory; this.items = enderChest.getContents();
} }
public void InventoryRemovalCheck() { @Override
owner.saveData(); public Inventory getBukkitInventory() {
if (transaction.isEmpty() && !playerOnline) { return inventory;
OpenInv.enderChests.remove(owner.getName().toLowerCase()); }
}
} @Override
public boolean inventoryRemovalCheck() {
public void PlayerGoOnline(Player p) { owner.saveData();
if (!playerOnline) { return transaction.isEmpty() && !playerOnline;
try { }
InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); @Override
field.setAccessible(true); public void setPlayerOnline(Player p) {
field.set(playerEnderChest, this.items); if (!playerOnline) {
} try {
catch (Exception e) {} InventoryEnderChest playerEnderChest = ((CraftPlayer) p).getHandle().getEnderChest();
p.saveData(); Field field = playerEnderChest.getClass().getField("items");
playerOnline = true; field.setAccessible(true);
} field.set(playerEnderChest, this.items);
} }
catch (Exception e) {}
public void PlayerGoOffline() { p.saveData();
playerOnline = false; playerOnline = true;
} }
}
public ItemStack[] getContents() {
return this.items; @Override
} public boolean setPlayerOffline() {
playerOnline = false;
public void onOpen(CraftHumanEntity who) { return inventoryRemovalCheck();
transaction.add(who); }
}
@Override
public void onClose(CraftHumanEntity who) { public ItemStack[] getContents() {
transaction.remove(who); return this.items;
this.InventoryRemovalCheck(); }
}
@Override
public List<HumanEntity> getViewers() { public void onOpen(CraftHumanEntity who) {
return transaction; transaction.add(who);
} }
public InventoryHolder getOwner() { @Override
return this.owner; public void onClose(CraftHumanEntity who) {
} transaction.remove(who);
this.inventoryRemovalCheck();
public void setMaxStackSize(int size) { }
maxStack = size;
} @Override
public List<HumanEntity> getViewers() {
public int getMaxStackSize() { return transaction;
return maxStack; }
}
@Override
public boolean a(EntityHuman entityhuman) { public InventoryHolder getOwner() {
return true; return this.owner;
} }
public void startOpen() { @Override
public void setMaxStackSize(int size) {
} maxStack = size;
}
public void f() {
@Override
} public int getMaxStackSize() {
return maxStack;
public void update() { }
enderChest.update();
} @Override
} public boolean a(EntityHuman entityhuman) {
return true;
}
@Override
public void startOpen() {
}
public void f() {
}
@Override
public void update() {
enderChest.update();
}
}

View File

@@ -1,253 +1,253 @@
/* /*
* Copyright (C) 2011-2014 lishid. All rights reserved. * Copyright (C) 2011-2014 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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_7_R2; package com.lishid.openinv.internal.v1_7_R2;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import com.lishid.openinv.OpenInv; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
// Volatile
//Volatile import net.minecraft.server.v1_7_R2.EntityHuman;
import net.minecraft.server.v1_7_R2.*; import net.minecraft.server.v1_7_R2.ItemStack;
import org.bukkit.craftbukkit.v1_7_R2.entity.*; import net.minecraft.server.v1_7_R2.PlayerInventory;
import org.bukkit.craftbukkit.v1_7_R2.inventory.*;
import org.bukkit.craftbukkit.v1_7_R2.entity.CraftHumanEntity;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;
CraftPlayer owner; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory;
public boolean playerOnline = false;
private ItemStack[] extra = new ItemStack[5]; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private CraftInventory inventory = new CraftInventory(this); CraftPlayer owner;
public boolean playerOnline = false;
public SpecialPlayerInventory(Player p, Boolean online) { private final ItemStack[] extra = new ItemStack[5];
super(((CraftPlayer) p).getHandle()); private final CraftInventory inventory = new CraftInventory(this);
this.owner = ((CraftPlayer) p);
this.playerOnline = online; public SpecialPlayerInventory(Player p, Boolean online) {
this.items = player.inventory.items; super(((CraftPlayer) p).getHandle());
this.armor = player.inventory.armor; this.owner = ((CraftPlayer) p);
OpenInv.inventories.put(owner.getName().toLowerCase(), this); this.playerOnline = online;
} this.items = player.inventory.items;
this.armor = player.inventory.armor;
@Override }
public Inventory getBukkitInventory() {
return inventory; @Override
} public Inventory getBukkitInventory() {
return inventory;
@Override }
public void InventoryRemovalCheck() {
owner.saveData(); @Override
if (transaction.isEmpty() && !playerOnline) { public boolean inventoryRemovalCheck() {
OpenInv.inventories.remove(owner.getName().toLowerCase()); owner.saveData();
} return transaction.isEmpty() && !playerOnline;
} }
@Override @Override
public void PlayerGoOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
CraftPlayer p = (CraftPlayer) player; CraftPlayer p = (CraftPlayer) player;
p.getHandle().inventory.items = this.items; p.getHandle().inventory.items = this.items;
p.getHandle().inventory.armor = this.armor; p.getHandle().inventory.armor = this.armor;
p.saveData(); p.saveData();
playerOnline = true; playerOnline = true;
} }
} }
@Override @Override
public void PlayerGoOffline() { public boolean setPlayerOffline() {
playerOnline = false; playerOnline = false;
this.InventoryRemovalCheck(); return this.inventoryRemovalCheck();
} }
@Override @Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
super.onClose(who); super.onClose(who);
this.InventoryRemovalCheck(); this.inventoryRemovalCheck();
} }
@Override @Override
public ItemStack[] getContents() { public ItemStack[] getContents() {
ItemStack[] C = new ItemStack[getSize()]; ItemStack[] C = new ItemStack[getSize()];
System.arraycopy(items, 0, C, 0, items.length); System.arraycopy(items, 0, C, 0, items.length);
System.arraycopy(items, 0, C, items.length, armor.length); System.arraycopy(items, 0, C, items.length, armor.length);
return C; return C;
} }
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 5; return super.getSize() + 5;
} }
@Override @Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
return is[i]; return is[i];
} }
@Override @Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack; ItemStack itemstack;
if (is[i].count <= j) { if (is[i].count <= j) {
itemstack = is[i]; itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
itemstack = is[i].a(j); itemstack = is[i].a(j);
if (is[i].count == 0) { if (is[i].count == 0) {
is[i] = null; is[i] = null;
} }
return itemstack; return itemstack;
} }
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
if (is[i] != null) { if (is[i] != null) {
ItemStack itemstack = is[i]; ItemStack itemstack = is[i];
is[i] = null; is[i] = null;
return itemstack; return itemstack;
} }
else { else {
return null; return null;
} }
} }
@Override @Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
ItemStack[] is = this.items; ItemStack[] is = this.items;
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.armor; is = this.armor;
} }
else { else {
i = getReversedItemSlotNum(i); i = getReversedItemSlotNum(i);
} }
if (i >= is.length) { if (i >= is.length) {
i -= is.length; i -= is.length;
is = this.extra; is = this.extra;
} }
else if (is == this.armor) { else if (is == this.armor) {
i = getReversedArmorSlotNum(i); i = getReversedArmorSlotNum(i);
} }
// Effects // Effects
if (is == this.extra) { if (is == this.extra) {
owner.getHandle().drop(itemstack, true); owner.getHandle().drop(itemstack, true);
itemstack = null; itemstack = null;
} }
is[i] = itemstack; is[i] = itemstack;
owner.getHandle().defaultContainer.b(); owner.getHandle().defaultContainer.b();
} }
private int getReversedItemSlotNum(int i) { private int getReversedItemSlotNum(int i) {
if (i >= 27) if (i >= 27)
return i - 27; return i - 27;
else else
return i + 9; return i + 9;
} }
private int getReversedArmorSlotNum(int i) { private int getReversedArmorSlotNum(int i) {
if (i == 0) if (i == 0)
return 3; return 3;
if (i == 1) if (i == 1)
return 2; return 2;
if (i == 2) if (i == 2)
return 1; return 1;
if (i == 3) if (i == 3)
return 0; return 0;
else else
return i; return i;
} }
@Override @Override
public String getInventoryName() { public String getInventoryName() {
if (player.getName().length() > 16) { if (player.getName().length() > 16) {
return player.getName().substring(0, 16); return player.getName().substring(0, 16);
} }
return player.getName(); return player.getName();
} }
@Override @Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return true; return true;
} }
} }

Some files were not shown because too many files have changed in this diff Show More