Compare commits

...

27 Commits
3.0.0 ... 3.1.2

Author SHA1 Message Date
Jikoo
32ec8d8147 Bump version to 3.1.2 for release 2017-02-13 20:01:18 -05:00
Jikoo
443e0c489e Synchronize cache (#63) 2017-02-13 19:56:32 -05:00
Jikoo
7ab0003b62 Bump version to 3.1.2-SNAPSHOT for development 2017-01-30 13:38:36 -05:00
Jikoo
12c0cac311 Bump version to 3.1.1 for release 2017-01-30 13:38:10 -05:00
Jikoo
f54481e872 Fix (NoSuchMethod)Exception being caught instead of NoSuchMethodError
Closes #62
2017-01-30 13:35:58 -05:00
Jikoo
f27dd8a233 Bump version to 3.1.1-SNAPSHOT for development 2017-01-20 13:02:47 -05:00
Jikoo
d6df1a0871 Bump version to 3.1.0 for release 2017-01-20 12:59:03 -05:00
Jikoo
e34e51d127 Better support other Player implementations
Closes #60
Removed all volatile comments - they require me to occasionally manually maintain them and NMS/OBC imports are already kept separate
2017-01-20 12:56:31 -05:00
Jikoo
5ca2ae461a Properly use Maven versioning for better support of dependent plugins
Closes #59
Bumped version to 3.1.0-SNAPSHOT for development, really should have bumped the minor version a while back.
2017-01-17 18:06:35 -05:00
Jikoo
4095e8039d RIPo.bukkit.org
repo.bukkit.org is dead, Spigot doesn't host builds that old. Didn't realize that I'd installed it locally when compiling CB 1.4.5 to use with OpenInv. Whoops.

Corrected dependency order - no idea why this compiled at all before. My bad.
2017-01-15 08:08:51 -05:00
Jikoo
73f390ab20 Jitpack's Maven version is pretty outdated. Hopefully fixes build.
The `all` profile is no longer active by default, just in case.
2017-01-15 07:33:53 -05:00
Jikoo
2f7d3bc235 Call InventoryOpenEvent when using SilentChest
Backport fix for incorrect parameter as well, just in case.
Fixed 1.7 and lower forcing all chests' default names to be "Large chest" instead of the translatable string.
2017-01-10 14:12:58 -05:00
Jikoo
ef486032f1 Fix incorrect parameter for SilentChest PacketPlayOutOpenWindow
Probably fixes issues with ProtocolSupport, and if it doesn't there's nothing else I can do as we'll be as close to identical to NMS as possible.
2017-01-10 12:50:24 -05:00
Jikoo
72ef873772 Fixes for shulker boxes and AnyChest in 1.11
Fixes IBlockData used being the default for a shulker box, closes #55
Corrected using wrong method to check if blocked in 1.11.2. Something something NMS version bumps.
2016-12-31 07:05:52 -05:00
Jikoo
9b6e32a775 Fix statistic changes breaking silent/anycontainer in 1.11.1+
C'mon Spigot team, this is why the revision bumps existed in the first place, to allow plugins that deal with NMS to easily and gracefully fail on unsupported versions. 1.11.1 should be R2, 1.11.2 should be R3. I get that NMS isn't officially supported, but honestly, either do away with the versioned packages entirely or keep up with them properly. It's a single string change, it's not like it's prohibitively difficult.
2016-12-29 09:05:01 -05:00
Jikoo
f05110c9b8 Fix getOnlinePlayers call to support all versions
Moved IPlayerDataManager from api module to common module - it is not part of the API as there is no supported way to obtain an instance of it.
2016-12-22 09:55:51 -05:00
Jikoo
a41f89b011 Release any players held by a disabling plugin 2016-12-16 15:13:04 -05:00
Jikoo
d24827ffcb Allow plugins to indicate to OpenInv that a Player is in use
This allows API users to prevent issues caused by multiple different copies of the Player being loaded, such as #49. Multiple instances of the same player could be obtained by calling IOpenInv#loadPlayer, waiting for OpenInv to remove it from the cache, then calling the method again.
2016-12-14 19:49:18 -05:00
Jikoo
802ce28103 Fix issue caused by module cleanup while backporting awarding achievement 2016-12-05 19:02:43 -05:00
Jikoo
f31356b227 Fix permissions mistakes in readme 2016-12-05 19:01:21 -05:00
Jikoo
7942466863 Maven cleanliness and API progress
The project was very messy and due to older Bukkit packaging conventions, 1_4_5 and 1_4_6 were sorted away from the rest of the versioned code. All of the versioned internals are now submodules of the internal module.
Rather than use the hackish existing method of abusing the shade plugin to combine "dependencies" for a dummy assembly project, we're actually using the assembly plugin.
Profiles are still split up between the parent pom and the internal module pom, but they're much more clean.

The API is now its own module and can be compiled and released as a separate file for developers. Soon, Bukkit ticket 20, you'll be closed.
2016-11-30 21:26:56 -05:00
Jikoo
db2cade4e2 Don't convert names in config to UUIDs on the main thread
This is pretty messy, but I can't think of a better way to avoid saving about 5 times in a row. Then again, I did just wake up, so my brain may not be on point yet.
2016-11-27 17:30:39 -05:00
Jikoo
718b4bb5dd Added /searchenchant, fixed a couple little mistakes
Mistakes being breaking UUID-based lookups and /anychest's toggle.
MY BAD, SORRY.
2016-11-27 06:38:24 -05:00
Jikoo
6aa25dd2dc Don't use reflection to increment container counter
Fixes #53 (pretty please with a cherry on top)
2016-11-27 06:13:17 -05:00
Jikoo
0bbcf6cdb2 Strip removed config options, add DisableSaving and bump config version 2016-11-26 17:05:06 -05:00
ShadowRanger
f11d60f78c Reimplement ShadowRanger's configuration updater and path changes
Bumped version for release
2016-11-26 16:57:03 -05:00
Jikoo
8a6b98614f Added support for UUID-based player lookups in 1.7.5+
You could argue that ShadowRanger's conversion of everything to UUID is better, but that would result in us having to contact Mojang's servers simply to fetch a player by UUID for versions < 1.7.5. It seems excessive (not to mention that uncached contact can result in rate limiting) when the server itself will not remember who they are across name changes. If they can re-obtain everything in their inventory, they can re-run /ac.
2016-11-26 15:31:53 -05:00
169 changed files with 2977 additions and 1557 deletions

2
.gitignore vendored
View File

@@ -5,6 +5,6 @@
**/.idea **/.idea
**/target **/target
**/bin **/bin
**/lib
**/out **/out
**dependency-reduced-pom.xml **dependency-reduced-pom.xml
**pom.xml.versionsBackup

View File

@@ -10,7 +10,7 @@ OpenInv is a [Bukkit plugin](https://dev.bukkit.org/bukkit-plugins/openinv/) whi
- **OpenEnder**: Open anyone's inventory, even if they're offline. - **OpenEnder**: Open anyone's inventory, even if they're offline.
- Read-only mode! No edits allowed! Don't grant `OpenInv.editender` - Read-only mode! No edits allowed! Don't grant `OpenInv.editender`
- Cross-world support! Don't grant `OpenInv.crossworld` - Cross-world support! Don't grant `OpenInv.crossworld`
- No self-opening! Don't grant `OpenInv.openself` - No opening others! Don't grant `OpenInv.openenderall`
- **SilentChest**: Open containers without displaying an animation or making sound. - **SilentChest**: Open containers without displaying an animation or making sound.
- **AnyChest**: Open containers, even if blocked by ocelots or blocks. - **AnyChest**: Open containers, even if blocked by ocelots or blocks.
@@ -80,7 +80,7 @@ OpenInv is a [Bukkit plugin](https://dev.bukkit.org/bukkit-plugins/openinv/) whi
<td>Required to use /openender.</td> <td>Required to use /openender.</td>
</tr> </tr>
<tr> <tr>
<td>OpenInv.editinv</td> <td>OpenInv.editender</td>
<td>Required to make changes to open ender chests.</td> <td>Required to make changes to open ender chests.</td>
</tr> </tr>
<tr> <tr>
@@ -117,9 +117,9 @@ OpenInv is a [Bukkit plugin](https://dev.bukkit.org/bukkit-plugins/openinv/) whi
To compile, the relevant Craftbukkit/Spigot jars must be installed in your local repository using the install plugin. To compile, the relevant Craftbukkit/Spigot jars must be installed in your local repository using the install plugin.
Ex: `mvn install:install-file -Dpackaging=jar -Dfile=spigot-1.11-R0.1-SNAPSHOT.jar -DgroupId=org.spigotmc -DartifactId=spigot -Dversion=1.11-R0.1-SNAPSHOT` Ex: `mvn install:install-file -Dpackaging=jar -Dfile=spigot-1.11-R0.1-SNAPSHOT.jar -DgroupId=org.spigotmc -DartifactId=spigot -Dversion=1.11-R0.1-SNAPSHOT`
Compiling OpenInv for a specific version is very easy - just compile the correct module. To compile for a specific version or set of versions, you'll need to use a profile. Provided profiles are `latest`, `modern` (versions 1.8+), and `all`. Select an existing profile using the `-P` argument (ex: `mvn clean package -am -P all`) or make your own. For more information, check out the [official guide](http://maven.apache.org/guides/introduction/introduction-to-profiles.html).
Compiling for a set of versions is slightly more complex. You'll need to use a profile for the versions you want to compile. Provided profiles are latest, modern (versions 1.8+), and all. For more information, check out the [official guide](http://maven.apache.org/guides/introduction/introduction-to-profiles.html). The final file is target/OpenInv.jar
## License ## License
``` ```

24
api/pom.xml Normal file
View File

@@ -0,0 +1,24 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lishid</groupId>
<artifactId>openinvparent</artifactId>
<version>3.1.2</version>
</parent>
<artifactId>openinvapi</artifactId>
<name>OpenInvAPI</name>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.4.5-R1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../lib/bukkit-1.4.5-R1.0.jar</systemPath>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,187 @@
package com.lishid.openinv;
import com.lishid.openinv.internal.IAnySilentContainer;
import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
/**
* Interface defining behavior for the OpenInv plugin.
*
* @author Jikoo
*/
public interface IOpenInv {
/**
* Checks if the server version is supported by OpenInv.
*
* @return true if the server version is supported
*/
public boolean isSupportedVersion();
/**
* Gets the active IInventoryAccess implementation. May return null if the server version is
* unsupported.
*
* @return the IInventoryAccess
*/
public IInventoryAccess getInventoryAccess();
/**
* Gets the active ISilentContainer implementation. May return null if the server version is
* unsupported.
*
* @return the ISilentContainer
*/
public IAnySilentContainer getAnySilentContainer();
/**
* Gets an ISpecialPlayerInventory for the given Player.
*
* @param player the Player
* @param online true if the Player is currently online
* @return the ISpecialPlayerInventory
*/
public ISpecialPlayerInventory getInventory(Player player, boolean online);
/**
* Gets an ISpecialEnderChest for the given Player.
*
* @param player the Player
* @param online true if the Player is currently online
* @return the ISpecialEnderChest
*/
public ISpecialEnderChest getEnderChest(Player player, boolean online);
/**
* Forcibly unload a cached Player's data.
*
* @param player the OfflinePlayer to unload
*/
public void unload(OfflinePlayer player);
/**
* Check the configuration value for whether or not OpenInv saves player data when unloading
* players. This is exclusively for users who do not allow editing of inventories, only viewing,
* and wish to prevent any possibility of bugs such as lishid#40. If true, OpenInv will not ever
* save any edits made to players.
*
* @return false unless configured otherwise
*/
public boolean disableSaving();
/**
* Check the configuration value for whether or not OpenInv displays a notification to the user
* when a container is activated with SilentChest.
*
* @return true unless configured otherwise
*/
public boolean notifySilentChest();
/**
* Check the configuration value for whether or not OpenInv displays a notification to the user
* when a container is activated with AnyChest.
*
* @return true unless configured otherwise
*/
public boolean notifyAnyChest();
/**
* Gets a player's SilentChest setting.
*
* @param player the OfflinePlayer
* @return true if SilentChest is enabled
*/
public boolean getPlayerSilentChestStatus(OfflinePlayer player);
/**
* Sets a player's SilentChest setting.
*
* @param player the OfflinePlayer
* @param status the status
*/
public void setPlayerSilentChestStatus(OfflinePlayer player, boolean status);
/**
* Gets the provided player's AnyChest setting.
*
* @param player the OfflinePlayer
* @return true if AnyChest is enabled
*/
public boolean getPlayerAnyChestStatus(OfflinePlayer player);
/**
* Sets a player's AnyChest setting.
*
* @param player the OfflinePlayer
* @param status the status
*/
public void setPlayerAnyChestStatus(OfflinePlayer player, boolean status);
/**
* Gets a unique identifier by which the OfflinePlayer can be referenced. Using the value
* returned to look up a Player will generally be much faster for later implementations.
*
* @param offline the OfflinePlayer
* @return the identifier
*/
public String getPlayerID(OfflinePlayer offline);
/**
* Get an OfflinePlayer by name.
* <p>
* Note: This method is potentially very heavily blocking. It should not ever be called on the
* main thread, and if it is, a stack trace will be displayed alerting server owners to the
* call.
*
* @param name the name of the Player
* @return the OfflinePlayer with the closest matching name or null if no players have ever logged in
*/
public OfflinePlayer matchPlayer(String name);
/**
* Load a Player from an OfflinePlayer. May return null under some circumstances.
*
* @param offline the OfflinePlayer to load a Player for
* @return the Player
*/
public Player loadPlayer(final OfflinePlayer offline);
/**
* Mark a Player as in use by a Plugin to prevent it from being removed from the cache. Used to
* prevent issues with multiple copies of the same Player being loaded such as lishid#49.
* Changes made to loaded copies overwrite changes to the others when saved, leading to
* duplication bugs and more.
* <p>
* When finished with the Player object, be sure to call {@link #releasePlayer(Player, Plugin)}
* to prevent the cache from keeping it stored until the plugin is disabled.
* <p>
* When using a Player object from OpenInv, you must handle the Player coming online, replacing
* your Player reference with the Player from the PlayerJoinEvent. In addition, you must change
* any values in the Player to reflect any unsaved alterations to the existing Player which do
* not affect the inventory or ender chest contents.
* <p>
* OpenInv only saves player data when unloading a Player from the cache, and then only if
* {@link #disableSaving()} returns false. If you are making changes that OpenInv does not cause
* to persist when a Player logs in as noted above, it is suggested that you manually call
* {@link Player#saveData()} when releasing your reference to ensure your changes persist.
*
* @param player the Player
* @param plugin the Plugin holding the reference to the Player
*/
public void retainPlayer(Player player, Plugin plugin);
/**
* Mark a Player as no longer in use by a Plugin to allow OpenInv to remove it from the cache
* when eligible.
*
* @param player the Player
* @param plugin the Plugin no longer holding a reference to the Player
*/
public void releasePlayer(Player player, Plugin plugin);
}

View File

@@ -4,205 +4,39 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvparent</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvassembly</artifactId> <artifactId>openinvassembly</artifactId>
<name>OpenInvAssembly</name> <name>OpenInvAssembly</name>
<profiles>
<profile>
<id>latest</id>
<dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_11_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>modern</id>
<dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_8_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_8_R2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_8_R3</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_9_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_9_R2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_10_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_11_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>all</id>
<dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_4_5</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_4_6</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_4_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_5_R2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_5_R3</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_6_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_6_R2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_6_R3</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_7_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_7_R2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_7_R3</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_7_R4</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_8_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_8_R2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_8_R3</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_9_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_9_R2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_10_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvadapter1_11_R1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</profile>
</profiles>
<build> <build>
<directory>../target</directory> <directory>../target</directory>
<finalName>OpenInv</finalName> <finalName>OpenInv</finalName>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId>
<artifactId>maven-shade-plugin</artifactId> <version>3.0.0</version>
<version>2.4.3</version>
<configuration>
<!--
~ This keeps the final file clean, but may cause issues for people not familiar with the setup.
~ If you're having trouble with the final product missing files, remove or tweak this configuration.
-->
<minimizeJar>true</minimizeJar>
<filters>
<filter>
<artifact>com.lishid:*</artifact>
<includes>
<include>com/lishid/openinv/**/*</include>
<include>plugin.yml</include>
</includes>
</filter>
</filters>
</configuration>
<executions> <executions>
<execution> <execution>
<id>reactor-uberjar</id>
<phase>package</phase> <phase>package</phase>
<goals> <goals>
<goal>shade</goal> <goal>single</goal>
</goals> </goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/assembly/reactor-uberjar.xml</descriptor>
</descriptors>
</configuration>
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

View File

@@ -0,0 +1,28 @@
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>reactor-uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<moduleSets>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<binaries>
<outputDirectory>/</outputDirectory>
<unpack>true</unpack>
<!-- unpackOptions must be present or build breaks. -->
<unpackOptions/>
</binaries>
</moduleSet>
</moduleSets>
</assembly>

29
common/pom.xml Normal file
View File

@@ -0,0 +1,29 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lishid</groupId>
<artifactId>openinvparent</artifactId>
<version>3.1.2</version>
</parent>
<artifactId>openinvcommon</artifactId>
<name>OpenInvCommon</name>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.4.5-R1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/../lib/bukkit-1.4.5-R1.0.jar</systemPath>
</dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvapi</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>
</project>

View File

@@ -16,6 +16,8 @@
package com.lishid.openinv.internal; package com.lishid.openinv.internal;
import java.util.Collection;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -39,4 +41,19 @@ public interface IPlayerDataManager {
*/ */
public String getPlayerDataID(OfflinePlayer player); public String getPlayerDataID(OfflinePlayer player);
/**
* Gets an OfflinePlayer by the given unique identifier.
*
* @param identifier the unique identifier
* @return the OfflinePlayer, or null if no exact match was found
*/
public OfflinePlayer getPlayerByID(String identifier);
/**
* Gets a Collection of all Players currently online.
*
* @return the Collection of Players
*/
public Collection<? extends Player> getOnlinePlayers();
} }

View File

@@ -9,7 +9,7 @@ import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap; import com.google.common.collect.TreeMultimap;
/** /**
* A minimal time-based cache implementation backed by a HashMap and TreeMultimap. * A minimal thread-safe time-based cache implementation backed by a HashMap and TreeMultimap.
* *
* @author Jikoo * @author Jikoo
*/ */
@@ -59,8 +59,10 @@ public class Cache<K, V> {
// Invalidate key - runs lazy check and ensures value won't be cleaned up early // Invalidate key - runs lazy check and ensures value won't be cleaned up early
invalidate(key); invalidate(key);
internal.put(key, value); synchronized (internal) {
expiry.put(System.currentTimeMillis() + retention, key); internal.put(key, value);
expiry.put(System.currentTimeMillis() + retention, key);
}
} }
/** /**
@@ -70,10 +72,12 @@ public class Cache<K, V> {
* @return the value to which the specified key is mapped, or null if no value is mapped for the key * @return the value to which the specified key is mapped, or null if no value is mapped for the key
*/ */
public V get(K key) { public V get(K key) {
// Run lazy check to clean cache synchronized (internal) {
lazyCheck(); // Run lazy check to clean cache
lazyCheck();
return internal.get(key); return internal.get(key);
}
} }
/** /**
@@ -83,10 +87,12 @@ public class Cache<K, V> {
* @return true if a mapping exists for the specified key * @return true if a mapping exists for the specified key
*/ */
public boolean containsKey(K key) { public boolean containsKey(K key) {
// Run lazy check to clean cache synchronized (internal) {
lazyCheck(); // Run lazy check to clean cache
lazyCheck();
return internal.containsKey(key); return internal.containsKey(key);
}
} }
/** /**
@@ -95,22 +101,24 @@ public class Cache<K, V> {
* @param key key to invalidate * @param key key to invalidate
*/ */
public void invalidate(K key) { public void invalidate(K key) {
// Run lazy check to clean cache synchronized (internal) {
lazyCheck(); // Run lazy check to clean cache
lazyCheck();
if (!internal.containsKey(key)) { if (!internal.containsKey(key)) {
// Value either not present or cleaned by lazy check. Either way, we're good // Value either not present or cleaned by lazy check. Either way, we're good
return; return;
} }
// Remove stored object // Remove stored object
internal.remove(key); internal.remove(key);
// Remove expiration entry - prevents more work later, plus prevents issues with values invalidating early // Remove expiration entry - prevents more work later, plus prevents issues with values invalidating early
for (Iterator<Map.Entry<Long, K>> iterator = expiry.entries().iterator(); iterator.hasNext();) { for (Iterator<Map.Entry<Long, K>> iterator = expiry.entries().iterator(); iterator.hasNext();) {
if (key.equals(iterator.next().getValue())) { if (key.equals(iterator.next().getValue())) {
iterator.remove(); iterator.remove();
break; break;
}
} }
} }
} }
@@ -119,11 +127,13 @@ public class Cache<K, V> {
* Forcibly invalidates all keys, even if they are considered to be in use. * Forcibly invalidates all keys, even if they are considered to be in use.
*/ */
public void invalidateAll() { public void invalidateAll() {
for (V value : internal.values()) { synchronized (internal) {
postRemoval.run(value); for (V value : internal.values()) {
postRemoval.run(value);
}
expiry.clear();
internal.clear();
} }
expiry.clear();
internal.clear();
} }
/** /**

View File

@@ -14,11 +14,17 @@
* 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.util;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer;
import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;

View File

@@ -1,4 +1,4 @@
package com.lishid.openinv; package com.lishid.openinv.util;
import org.bukkit.permissions.Permissible; import org.bukkit.permissions.Permissible;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_4_5</artifactId> <artifactId>openinvadapter1_4_5</artifactId>
<name>OpenInvAdapter1_4_5</name> <name>OpenInvAdapter1_4_5</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.4.5-R1.0</version> <version>1.4.5-R1.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_4_5; package com.lishid.openinv.internal.v1_4_5;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_4_5.AxisAlignedBB; import net.minecraft.server.v1_4_5.AxisAlignedBB;
import net.minecraft.server.v1_4_5.BlockEnderChest; import net.minecraft.server.v1_4_5.BlockEnderChest;
import net.minecraft.server.v1_4_5.Container;
import net.minecraft.server.v1_4_5.EntityOcelot; import net.minecraft.server.v1_4_5.EntityOcelot;
import net.minecraft.server.v1_4_5.EntityPlayer; import net.minecraft.server.v1_4_5.EntityPlayer;
import net.minecraft.server.v1_4_5.IInventory; import net.minecraft.server.v1_4_5.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_4_5.TileEntityChest;
import net.minecraft.server.v1_4_5.TileEntityEnderChest; import net.minecraft.server.v1_4_5.TileEntityEnderChest;
import net.minecraft.server.v1_4_5.World; import net.minecraft.server.v1_4_5.World;
import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_5.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.netServerHandler.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize()));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.netServerHandler.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize()));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_4_5;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_4_5.IInventory; import net.minecraft.server.v1_4_5.IInventory;
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_4_5; package com.lishid.openinv.internal.v1_4_5;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_4_5.EntityPlayer; import net.minecraft.server.v1_4_5.EntityPlayer;
import net.minecraft.server.v1_4_5.ItemInWorldManager; import net.minecraft.server.v1_4_5.ItemInWorldManager;
import net.minecraft.server.v1_4_5.MinecraftServer; import net.minecraft.server.v1_4_5.MinecraftServer;
import org.bukkit.craftbukkit.v1_4_5.CraftServer; import org.bukkit.craftbukkit.v1_4_5.CraftServer;
import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -59,4 +63,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().f(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_4_5; package com.lishid.openinv.internal.v1_4_5;
// Volatile
import net.minecraft.server.v1_4_5.ContainerChest; import net.minecraft.server.v1_4_5.ContainerChest;
import net.minecraft.server.v1_4_5.EntityHuman; import net.minecraft.server.v1_4_5.EntityHuman;
import net.minecraft.server.v1_4_5.IInventory; import net.minecraft.server.v1_4_5.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_4_5.EntityPlayer;
import net.minecraft.server.v1_4_5.IInventory; import net.minecraft.server.v1_4_5.IInventory;
import net.minecraft.server.v1_4_5.InventoryEnderChest; import net.minecraft.server.v1_4_5.InventoryEnderChest;
import net.minecraft.server.v1_4_5.InventorySubcontainer; import net.minecraft.server.v1_4_5.InventorySubcontainer;
@@ -46,12 +46,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(((CraftPlayer) player).getHandle().getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); ((CraftPlayer) player).getHandle().getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -64,8 +64,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_4_5.ItemStack; import net.minecraft.server.v1_4_5.ItemStack;
import net.minecraft.server.v1_4_5.PlayerInventory; import net.minecraft.server.v1_4_5.PlayerInventory;
import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_4_6</artifactId> <artifactId>openinvadapter1_4_6</artifactId>
<name>OpenInvAdapter1_4_6</name> <name>OpenInvAdapter1_4_6</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.4.6-R0.3</version> <version>1.4.6-R0.3</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_4_6; package com.lishid.openinv.internal.v1_4_6;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_4_6.AxisAlignedBB; import net.minecraft.server.v1_4_6.AxisAlignedBB;
import net.minecraft.server.v1_4_6.BlockEnderChest; import net.minecraft.server.v1_4_6.BlockEnderChest;
import net.minecraft.server.v1_4_6.Container;
import net.minecraft.server.v1_4_6.EntityOcelot; import net.minecraft.server.v1_4_6.EntityOcelot;
import net.minecraft.server.v1_4_6.EntityPlayer; import net.minecraft.server.v1_4_6.EntityPlayer;
import net.minecraft.server.v1_4_6.IInventory; import net.minecraft.server.v1_4_6.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_4_6.TileEntityChest;
import net.minecraft.server.v1_4_6.TileEntityEnderChest; import net.minecraft.server.v1_4_6.TileEntityEnderChest;
import net.minecraft.server.v1_4_6.World; import net.minecraft.server.v1_4_6.World;
import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_6.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize()));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize()));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_4_6;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_4_6.IInventory; import net.minecraft.server.v1_4_6.IInventory;
import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_4_6; package com.lishid.openinv.internal.v1_4_6;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_4_6.EntityPlayer; import net.minecraft.server.v1_4_6.EntityPlayer;
import net.minecraft.server.v1_4_6.MinecraftServer; import net.minecraft.server.v1_4_6.MinecraftServer;
import net.minecraft.server.v1_4_6.PlayerInteractManager; import net.minecraft.server.v1_4_6.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_4_6.CraftServer; import org.bukkit.craftbukkit.v1_4_6.CraftServer;
import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -59,4 +63,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().f(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_4_6; package com.lishid.openinv.internal.v1_4_6;
// Volatile
import net.minecraft.server.v1_4_6.ContainerChest; import net.minecraft.server.v1_4_6.ContainerChest;
import net.minecraft.server.v1_4_6.EntityHuman; import net.minecraft.server.v1_4_6.EntityHuman;
import net.minecraft.server.v1_4_6.IInventory; import net.minecraft.server.v1_4_6.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_4_6.EntityPlayer;
import net.minecraft.server.v1_4_6.IInventory; import net.minecraft.server.v1_4_6.IInventory;
import net.minecraft.server.v1_4_6.InventoryEnderChest; import net.minecraft.server.v1_4_6.InventoryEnderChest;
import net.minecraft.server.v1_4_6.InventorySubcontainer; import net.minecraft.server.v1_4_6.InventorySubcontainer;
@@ -46,12 +46,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(((CraftPlayer) player).getHandle().getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); ((CraftPlayer) player).getHandle().getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -64,8 +64,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_4_6.ItemStack; import net.minecraft.server.v1_4_6.ItemStack;
import net.minecraft.server.v1_4_6.PlayerInventory; import net.minecraft.server.v1_4_6.PlayerInventory;
import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,20 +4,65 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvparent</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvinternal</artifactId> <artifactId>openinvinternal</artifactId>
<name>OpenInvInternal</name> <name>OpenInvInternal</name>
<dependencies> <packaging>pom</packaging>
<dependency>
<groupId>org.bukkit</groupId> <profiles>
<artifactId>bukkit</artifactId>
<version>1.4.5-R1.0</version> <profile>
<scope>provided</scope> <id>latest</id>
</dependency> <modules>
</dependencies> <module>v1_11_R1</module>
</modules>
</profile>
<profile>
<id>modern</id>
<modules>
<module>v1_8_R1</module>
<module>v1_8_R2</module>
<module>v1_8_R3</module>
<module>v1_9_R1</module>
<module>v1_9_R2</module>
<module>v1_10_R1</module>
<module>v1_11_R1</module>
</modules>
</profile>
<profile>
<id>all</id>
<modules>
<module>1_4_5</module>
<module>1_4_6</module>
<module>v1_4_R1</module>
<!-- 1_5_R1 was never released -->
<module>v1_5_R2</module>
<module>v1_5_R3</module>
<!-- 1_6_R1 also had no tagged releases, remove? -->
<module>v1_6_R1</module>
<module>v1_6_R2</module>
<module>v1_6_R3</module>
<!-- TODO: Recompile CB for 1_7_R1 through 1_7_R4, currently using whatever jars worked -->
<module>v1_7_R1</module>
<module>v1_7_R2</module>
<module>v1_7_R3</module>
<module>v1_7_R4</module>
<module>v1_8_R1</module>
<module>v1_8_R2</module>
<module>v1_8_R3</module>
<module>v1_9_R1</module>
<module>v1_9_R2</module>
<module>v1_10_R1</module>
<module>v1_11_R1</module>
</modules>
</profile>
</profiles>
</project> </project>

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_10_R1</artifactId> <artifactId>openinvadapter1_10_R1</artifactId>
<name>OpenInvAdapter1_10_R1</name> <name>OpenInvAdapter1_10_R1</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.10-R0.1-SNAPSHOT</version> <version>1.10-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -22,18 +22,16 @@ import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_10_R1.AxisAlignedBB; import net.minecraft.server.v1_10_R1.AxisAlignedBB;
import net.minecraft.server.v1_10_R1.Block; import net.minecraft.server.v1_10_R1.Block;
import net.minecraft.server.v1_10_R1.BlockChest; import net.minecraft.server.v1_10_R1.BlockChest;
import net.minecraft.server.v1_10_R1.BlockChest.Type;
import net.minecraft.server.v1_10_R1.BlockEnderChest; import net.minecraft.server.v1_10_R1.BlockEnderChest;
import net.minecraft.server.v1_10_R1.BlockPosition; import net.minecraft.server.v1_10_R1.BlockPosition;
import net.minecraft.server.v1_10_R1.Container;
import net.minecraft.server.v1_10_R1.Entity; import net.minecraft.server.v1_10_R1.Entity;
import net.minecraft.server.v1_10_R1.EntityOcelot; import net.minecraft.server.v1_10_R1.EntityOcelot;
import net.minecraft.server.v1_10_R1.EntityPlayer; import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.EnumDirection; import net.minecraft.server.v1_10_R1.EnumDirection;
import net.minecraft.server.v1_10_R1.IInventory;
import net.minecraft.server.v1_10_R1.ITileInventory; import net.minecraft.server.v1_10_R1.ITileInventory;
import net.minecraft.server.v1_10_R1.InventoryEnderChest; import net.minecraft.server.v1_10_R1.InventoryEnderChest;
import net.minecraft.server.v1_10_R1.InventoryLargeChest; import net.minecraft.server.v1_10_R1.InventoryLargeChest;
@@ -44,7 +42,7 @@ import net.minecraft.server.v1_10_R1.TileEntityChest;
import net.minecraft.server.v1_10_R1.TileEntityEnderChest; import net.minecraft.server.v1_10_R1.TileEntityEnderChest;
import net.minecraft.server.v1_10_R1.World; import net.minecraft.server.v1_10_R1.World;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_10_R1.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -55,7 +53,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ());
Block block = world.getType(blockPosition).getBlock(); Block block = world.getType(blockPosition).getBlock();
@@ -114,7 +112,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is pretty much API-only // Silent ender chest is pretty much API-only
if (silentchest && b.getType() == Material.ENDER_CHEST) { if (silentchest && b.getType() == Material.ENDER_CHEST) {
@@ -140,11 +138,13 @@ public class AnySilentContainer implements IAnySilentContainer {
return true; return true;
} }
if (!(tile instanceof IInventory)) { if (!(tile instanceof ITileInventory)) {
return false; return false;
} }
ITileInventory tileInventory = (ITileInventory) tile;
Block block = world.getType(blockPosition).getBlock(); Block block = world.getType(blockPosition).getBlock();
Container container = null;
if (block instanceof BlockChest) { if (block instanceof BlockChest) {
for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) { for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
@@ -161,46 +161,54 @@ public class AnySilentContainer implements IAnySilentContainer {
} }
if ((localEnumDirection == EnumDirection.WEST) || (localEnumDirection == EnumDirection.NORTH)) { if ((localEnumDirection == EnumDirection.WEST) || (localEnumDirection == EnumDirection.NORTH)) {
tile = new InventoryLargeChest("container.chestDouble", tileInventory = new InventoryLargeChest("container.chestDouble",
(TileEntityChest) localTileEntity, (ITileInventory) tile); (TileEntityChest) localTileEntity, tileInventory);
} else { } else {
tile = new InventoryLargeChest("container.chestDouble", tileInventory = new InventoryLargeChest("container.chestDouble",
(ITileInventory) tile, (TileEntityChest) localTileEntity); tileInventory, (TileEntityChest) localTileEntity);
} }
break; break;
} }
if (silentchest) { BlockChest blockChest = (BlockChest) block;
tile = new SilentContainerChest(player.inventory, ((IInventory) tile), player); if (blockChest.g == BlockChest.Type.BASIC) {
}
if (((BlockChest) block).g == Type.BASIC)
player.b(StatisticList.ac); player.b(StatisticList.ac);
else if (((BlockChest) block).g == Type.TRAP) { } else if (blockChest.g == BlockChest.Type.TRAP) {
player.b(StatisticList.W); player.b(StatisticList.W);
} }
}
boolean returnValue = false; if (silentchest) {
if (!silentchest) { container = new SilentContainerChest(player.inventory, tileInventory, player);
player.openContainer((IInventory) tile);
returnValue = true;
} else {
try {
SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) tile), player);
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) tile).getScoreboardDisplayName(), ((IInventory) tile).getSize()));
player.activeContainer = silentContainerChest;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
} }
} }
return returnValue; // AnyChest only - SilentChest not active or container unsupported
if (!silentchest || container == null) {
player.openContainer(tileInventory);
return true;
}
// SilentChest
try {
// Call InventoryOpenEvent
container = CraftEventFactory.callInventoryOpenEvent(player, container, false);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, tileInventory.getContainerName(), tileInventory.getScoreboardDisplayName(), tileInventory.getSize()));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_10_R1;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_10_R1.IInventory; import net.minecraft.server.v1_10_R1.IInventory;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;

View File

@@ -16,20 +16,24 @@
package com.lishid.openinv.internal.v1_10_R1; package com.lishid.openinv.internal.v1_10_R1;
import java.util.Collection;
import java.util.UUID;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_10_R1.EntityPlayer; import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.MinecraftServer; import net.minecraft.server.v1_10_R1.MinecraftServer;
import net.minecraft.server.v1_10_R1.PlayerInteractManager; import net.minecraft.server.v1_10_R1.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_10_R1.CraftServer; import org.bukkit.craftbukkit.v1_10_R1.CraftServer;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -61,4 +65,45 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getUniqueId().toString(); return player.getUniqueId().toString();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
try {
UUID uuid = UUID.fromString(identifier);
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
} catch (IllegalArgumentException e) {
// Not a UUID
return null;
}
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Bukkit.getOnlinePlayers();
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_10_R1; package com.lishid.openinv.internal.v1_10_R1;
// Volatile
import net.minecraft.server.v1_10_R1.ContainerChest; import net.minecraft.server.v1_10_R1.ContainerChest;
import net.minecraft.server.v1_10_R1.EntityHuman; import net.minecraft.server.v1_10_R1.EntityHuman;
import net.minecraft.server.v1_10_R1.IInventory; import net.minecraft.server.v1_10_R1.IInventory;

View File

@@ -24,13 +24,12 @@ import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile import net.minecraft.server.v1_10_R1.EntityPlayer;
import net.minecraft.server.v1_10_R1.IInventory; import net.minecraft.server.v1_10_R1.IInventory;
import net.minecraft.server.v1_10_R1.InventoryEnderChest; import net.minecraft.server.v1_10_R1.InventoryEnderChest;
import net.minecraft.server.v1_10_R1.InventorySubcontainer; import net.minecraft.server.v1_10_R1.InventorySubcontainer;
import net.minecraft.server.v1_10_R1.ItemStack; import net.minecraft.server.v1_10_R1.ItemStack;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
@@ -40,12 +39,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialEnderChest(Player player, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) player).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(),
((CraftPlayer) player).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer craftPlayer = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = craftPlayer.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.bukkitOwner = craftPlayer; this.bukkitOwner = nmsPlayer.getBukkitEntity();
setItemArrays(this, enderChest.getContents()); setItemArrays(this, enderChest.getContents());
} }
@@ -78,9 +77,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
this.bukkitOwner = player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
CraftPlayer craftPlayer = (CraftPlayer) player; this.bukkitOwner = nmsPlayer.getBukkitEntity();
setItemArrays(craftPlayer.getHandle().getEnderChest(), this.items); setItemArrays(nmsPlayer.getEnderChest(), this.items);
} catch (Exception e) {} } catch (Exception e) {}
playerOnline = true; playerOnline = true;
} }

View File

@@ -24,12 +24,10 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_10_R1.EntityHuman; import net.minecraft.server.v1_10_R1.EntityHuman;
import net.minecraft.server.v1_10_R1.ItemStack; import net.minecraft.server.v1_10_R1.ItemStack;
import net.minecraft.server.v1_10_R1.PlayerInventory; import net.minecraft.server.v1_10_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -39,7 +37,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots); setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots);
} }
@@ -89,7 +87,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
setItemArrays(this.player.inventory, items, armor, extraSlots); setItemArrays(this.player.inventory, items, armor, extraSlots);
playerOnline = true; playerOnline = true;
} }

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_11_R1</artifactId> <artifactId>openinvadapter1_11_R1</artifactId>
<name>OpenInvAdapter1_11_R1</name> <name>OpenInvAdapter1_11_R1</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.11-R0.1-SNAPSHOT</version> <version>1.11.2-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -25,11 +25,9 @@ import org.bukkit.block.BlockState;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
// Volatile
import net.minecraft.server.v1_11_R1.AxisAlignedBB; import net.minecraft.server.v1_11_R1.AxisAlignedBB;
import net.minecraft.server.v1_11_R1.Block; import net.minecraft.server.v1_11_R1.Block;
import net.minecraft.server.v1_11_R1.BlockChest; import net.minecraft.server.v1_11_R1.BlockChest;
import net.minecraft.server.v1_11_R1.BlockChest.Type;
import net.minecraft.server.v1_11_R1.BlockEnderChest; import net.minecraft.server.v1_11_R1.BlockEnderChest;
import net.minecraft.server.v1_11_R1.BlockPosition; import net.minecraft.server.v1_11_R1.BlockPosition;
import net.minecraft.server.v1_11_R1.BlockShulkerBox; import net.minecraft.server.v1_11_R1.BlockShulkerBox;
@@ -39,7 +37,6 @@ import net.minecraft.server.v1_11_R1.EntityOcelot;
import net.minecraft.server.v1_11_R1.EntityPlayer; import net.minecraft.server.v1_11_R1.EntityPlayer;
import net.minecraft.server.v1_11_R1.EnumDirection; import net.minecraft.server.v1_11_R1.EnumDirection;
import net.minecraft.server.v1_11_R1.IBlockData; import net.minecraft.server.v1_11_R1.IBlockData;
import net.minecraft.server.v1_11_R1.IInventory;
import net.minecraft.server.v1_11_R1.ITileInventory; import net.minecraft.server.v1_11_R1.ITileInventory;
import net.minecraft.server.v1_11_R1.InventoryEnderChest; import net.minecraft.server.v1_11_R1.InventoryEnderChest;
import net.minecraft.server.v1_11_R1.InventoryLargeChest; import net.minecraft.server.v1_11_R1.InventoryLargeChest;
@@ -51,7 +48,7 @@ import net.minecraft.server.v1_11_R1.TileEntityEnderChest;
import net.minecraft.server.v1_11_R1.TileEntityShulkerBox; import net.minecraft.server.v1_11_R1.TileEntityShulkerBox;
import net.minecraft.server.v1_11_R1.World; import net.minecraft.server.v1_11_R1.World;
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -66,13 +63,14 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ());
Block block = world.getType(blockPosition).getBlock(); IBlockData blockData = world.getType(blockPosition);
Block block = blockData.getBlock();
if (block instanceof BlockShulkerBox) { if (block instanceof BlockShulkerBox) {
return isBlockedShulkerBox(world, blockPosition, block); return isBlockedShulkerBox(world, blockPosition, blockData);
} }
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -107,7 +105,7 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
private boolean isBlockedShulkerBox(World world, BlockPosition blockPosition, Block block) { private boolean isBlockedShulkerBox(World world, BlockPosition blockPosition, IBlockData blockData) {
// For reference, look at net.minecraft.server.BlockShulkerBox // For reference, look at net.minecraft.server.BlockShulkerBox
TileEntity tile = world.getTileEntity(blockPosition); TileEntity tile = world.getTileEntity(blockPosition);
@@ -115,16 +113,20 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IBlockData iBlockData = block.getBlockData(); EnumDirection enumDirection = blockData.get(BlockShulkerBox.a);
EnumDirection enumDirection = iBlockData.get(BlockShulkerBox.a);
if (((TileEntityShulkerBox) tile).p() == TileEntityShulkerBox.AnimationPhase.CLOSED) { if (((TileEntityShulkerBox) tile).p() == TileEntityShulkerBox.AnimationPhase.CLOSED) {
AxisAlignedBB axisAlignedBB = BlockShulkerBox.j.b(0.5F * enumDirection.getAdjacentX(), AxisAlignedBB axisAlignedBB = Block.j.b(0.5F * enumDirection.getAdjacentX(),
0.5F * enumDirection.getAdjacentY(), 0.5F * enumDirection.getAdjacentZ()) 0.5F * enumDirection.getAdjacentY(), 0.5F * enumDirection.getAdjacentZ())
.a(enumDirection.getAdjacentX(), enumDirection.getAdjacentY(), .a(enumDirection.getAdjacentX(), enumDirection.getAdjacentY(),
enumDirection.getAdjacentZ()); enumDirection.getAdjacentZ());
return world.b(axisAlignedBB.a(blockPosition.shift(enumDirection))); try {
// 1.11.2
return world.a(axisAlignedBB.a(blockPosition.shift(enumDirection)));
} catch (NoSuchMethodError e) {
// 1.11
return world.b(axisAlignedBB.a(blockPosition.shift(enumDirection)));
}
} }
return false; return false;
@@ -152,18 +154,18 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is pretty much API-only // Silent ender chest is pretty much API-only
if (silentchest && b.getType() == Material.ENDER_CHEST) { if (silentchest && b.getType() == Material.ENDER_CHEST) {
p.openInventory(p.getEnderChest()); p.openInventory(p.getEnderChest());
player.b(StatisticList.X); player.b(StatisticList.getStatistic("stat.enderchestOpened"));
return true; return true;
} }
final World world = player.world; final World world = player.world;
final BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); final BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ());
Object tile = world.getTileEntity(blockPosition); final Object tile = world.getTileEntity(blockPosition);
if (tile == null) { if (tile == null) {
return false; return false;
@@ -174,20 +176,19 @@ public class AnySilentContainer implements IAnySilentContainer {
InventoryEnderChest enderChest = player.getEnderChest(); InventoryEnderChest enderChest = player.getEnderChest();
enderChest.a((TileEntityEnderChest) tile); enderChest.a((TileEntityEnderChest) tile);
player.openContainer(enderChest); player.openContainer(enderChest);
player.b(StatisticList.X); player.b(StatisticList.getStatistic("stat.enderchestOpened"));
return true; return true;
} }
if (!(tile instanceof IInventory)) { if (!(tile instanceof ITileInventory)) {
return false; return false;
} }
ITileInventory tileInventory = (ITileInventory) tile;
Block block = world.getType(blockPosition).getBlock(); Block block = world.getType(blockPosition).getBlock();
Container container = null; Container container = null;
if (block instanceof BlockChest) { if (block instanceof BlockChest) {
BlockChest blockChest = (BlockChest) block;
for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) { for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection); BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection);
Block localBlock = world.getType(localBlockPosition).getBlock(); Block localBlock = world.getType(localBlockPosition).getBlock();
@@ -202,75 +203,84 @@ public class AnySilentContainer implements IAnySilentContainer {
} }
if ((localEnumDirection == EnumDirection.WEST) || (localEnumDirection == EnumDirection.NORTH)) { if ((localEnumDirection == EnumDirection.WEST) || (localEnumDirection == EnumDirection.NORTH)) {
tile = new InventoryLargeChest("container.chestDouble", tileInventory = new InventoryLargeChest("container.chestDouble",
(TileEntityChest) localTileEntity, (ITileInventory) tile); (TileEntityChest) localTileEntity, tileInventory);
} else { } else {
tile = new InventoryLargeChest("container.chestDouble", tileInventory = new InventoryLargeChest("container.chestDouble",
(ITileInventory) tile, (TileEntityChest) localTileEntity); tileInventory, (TileEntityChest) localTileEntity);
} }
break; break;
} }
if (blockChest.g == Type.BASIC) BlockChest blockChest = (BlockChest) block;
player.b(StatisticList.ac); if (blockChest.g == BlockChest.Type.BASIC) {
else if (blockChest.g == Type.TRAP) { player.b(StatisticList.getStatistic("stat.chestOpened"));
player.b(StatisticList.W); } else if (blockChest.g == BlockChest.Type.TRAP) {
player.b(StatisticList.getStatistic("stat.trappedChestTriggered"));
} }
if (silentchest) { if (silentchest) {
container = new SilentContainerChest(player.inventory, ((IInventory) tile), player); container = new SilentContainerChest(player.inventory, tileInventory, player);
} }
} }
if (block instanceof BlockShulkerBox) { if (block instanceof BlockShulkerBox) {
player.b(StatisticList.ae); player.b(StatisticList.getStatistic("stat.shulkerBoxOpened"));
if (silentchest && tile instanceof TileEntityShulkerBox) { if (silentchest && tileInventory instanceof TileEntityShulkerBox) {
// Set value to current + 1. Ensures consistency later when resetting. // Set value to current + 1. Ensures consistency later when resetting.
SilentContainerShulkerBox.setOpenValue((TileEntityShulkerBox) tile, SilentContainerShulkerBox.setOpenValue((TileEntityShulkerBox) tileInventory,
SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tile) + 1); SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tileInventory) + 1);
container = new SilentContainerShulkerBox(player.inventory, (IInventory) tile, player); container = new SilentContainerShulkerBox(player.inventory, tileInventory, player);
} }
} }
boolean returnValue = false; // AnyChest only - SilentChest not active or container unsupported
final IInventory iInventory = (IInventory) tile;
if (!silentchest || container == null) { if (!silentchest || container == null) {
player.openContainer(iInventory); player.openContainer(tileInventory);
returnValue = true; return true;
} else {
try {
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, iInventory.getName(), iInventory.getScoreboardDisplayName(), iInventory.getSize()));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
if (tile instanceof TileEntityShulkerBox) {
new BukkitRunnable() {
@Override
public void run() {
// TODO hacky
Object tile = world.getTileEntity(blockPosition);
if (!(tile instanceof TileEntityShulkerBox)) {
return;
}
TileEntityShulkerBox box = (TileEntityShulkerBox) tile;
// Reset back - we added 1, and calling TileEntityShulkerBox#startOpen adds 1 more.
SilentContainerShulkerBox.setOpenValue(box,
SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tile) - 2);
}
}.runTaskLater(Bukkit.getPluginManager().getPlugin("OpenInv"), 2);
}
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
container = CraftEventFactory.callInventoryOpenEvent(player, container, false);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, tileInventory.getContainerName(), tileInventory.getScoreboardDisplayName(), tileInventory.getSize()));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
// Special handling for shulker boxes - reset value for viewers to what it was initially.
if (tile instanceof TileEntityShulkerBox) {
new BukkitRunnable() {
@Override
public void run() {
// TODO hacky
Object tile = world.getTileEntity(blockPosition);
if (!(tile instanceof TileEntityShulkerBox)) {
return;
}
TileEntityShulkerBox box = (TileEntityShulkerBox) tile;
// Reset back - we added 1, and calling TileEntityShulkerBox#startOpen adds 1 more.
SilentContainerShulkerBox.setOpenValue(box,
SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tile) - 2);
}
}.runTaskLater(Bukkit.getPluginManager().getPlugin("OpenInv"), 2);
}
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_11_R1;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_11_R1.IInventory; import net.minecraft.server.v1_11_R1.IInventory;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;

View File

@@ -16,20 +16,24 @@
package com.lishid.openinv.internal.v1_11_R1; package com.lishid.openinv.internal.v1_11_R1;
import java.util.Collection;
import java.util.UUID;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_11_R1.EntityPlayer; import net.minecraft.server.v1_11_R1.EntityPlayer;
import net.minecraft.server.v1_11_R1.MinecraftServer; import net.minecraft.server.v1_11_R1.MinecraftServer;
import net.minecraft.server.v1_11_R1.PlayerInteractManager; import net.minecraft.server.v1_11_R1.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_11_R1.CraftServer; import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -61,4 +65,45 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getUniqueId().toString(); return player.getUniqueId().toString();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
try {
UUID uuid = UUID.fromString(identifier);
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
} catch (IllegalArgumentException e) {
// Not a UUID
return null;
}
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Bukkit.getOnlinePlayers();
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_11_R1; package com.lishid.openinv.internal.v1_11_R1;
// Volatile
import net.minecraft.server.v1_11_R1.ContainerChest; import net.minecraft.server.v1_11_R1.ContainerChest;
import net.minecraft.server.v1_11_R1.EntityHuman; import net.minecraft.server.v1_11_R1.EntityHuman;
import net.minecraft.server.v1_11_R1.IInventory; import net.minecraft.server.v1_11_R1.IInventory;

View File

@@ -25,13 +25,12 @@ import com.lishid.openinv.internal.ISpecialEnderChest;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile import net.minecraft.server.v1_11_R1.EntityPlayer;
import net.minecraft.server.v1_11_R1.IInventory; import net.minecraft.server.v1_11_R1.IInventory;
import net.minecraft.server.v1_11_R1.InventoryEnderChest; import net.minecraft.server.v1_11_R1.InventoryEnderChest;
import net.minecraft.server.v1_11_R1.InventorySubcontainer; import net.minecraft.server.v1_11_R1.InventorySubcontainer;
import net.minecraft.server.v1_11_R1.ItemStack; import net.minecraft.server.v1_11_R1.ItemStack;
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;
public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest {
@@ -41,12 +40,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialEnderChest(Player player, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) player).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(),
((CraftPlayer) player).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer craftPlayer = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = craftPlayer.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.bukkitOwner = craftPlayer; this.bukkitOwner = nmsPlayer.getBukkitEntity();
setItemLists(this, enderChest.getContents()); setItemLists(this, enderChest.getContents());
} }
@@ -79,9 +78,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
this.bukkitOwner = player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
CraftPlayer craftPlayer = (CraftPlayer) player; this.bukkitOwner = nmsPlayer.getBukkitEntity();
setItemLists(craftPlayer.getHandle().getEnderChest(), this.items); setItemLists(nmsPlayer.getEnderChest(), this.items);
} catch (Exception e) {} } catch (Exception e) {}
playerOnline = true; playerOnline = true;
} }

View File

@@ -26,13 +26,11 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import net.minecraft.server.v1_11_R1.ContainerUtil; import net.minecraft.server.v1_11_R1.ContainerUtil;
// Volatile
import net.minecraft.server.v1_11_R1.EntityHuman; import net.minecraft.server.v1_11_R1.EntityHuman;
import net.minecraft.server.v1_11_R1.ItemStack; import net.minecraft.server.v1_11_R1.ItemStack;
import net.minecraft.server.v1_11_R1.NonNullList; import net.minecraft.server.v1_11_R1.NonNullList;
import net.minecraft.server.v1_11_R1.PlayerInventory; import net.minecraft.server.v1_11_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -41,7 +39,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots); setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots);
} }
@@ -91,7 +89,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);;
setItemArrays(this.player.inventory, items, armor, extraSlots); setItemArrays(this.player.inventory, items, armor, extraSlots);
playerOnline = true; playerOnline = true;
} }

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_4_R1</artifactId> <artifactId>openinvadapter1_4_R1</artifactId>
<name>OpenInvAdapter1_4_R1</name> <name>OpenInvAdapter1_4_R1</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.4.7-R1.0</version> <version>1.4.7-R1.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_4_R1; package com.lishid.openinv.internal.v1_4_R1;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_4_R1.AxisAlignedBB; import net.minecraft.server.v1_4_R1.AxisAlignedBB;
import net.minecraft.server.v1_4_R1.BlockEnderChest; import net.minecraft.server.v1_4_R1.BlockEnderChest;
import net.minecraft.server.v1_4_R1.Container;
import net.minecraft.server.v1_4_R1.EntityOcelot; import net.minecraft.server.v1_4_R1.EntityOcelot;
import net.minecraft.server.v1_4_R1.EntityPlayer; import net.minecraft.server.v1_4_R1.EntityPlayer;
import net.minecraft.server.v1_4_R1.IInventory; import net.minecraft.server.v1_4_R1.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_4_R1.TileEntityChest;
import net.minecraft.server.v1_4_R1.TileEntityEnderChest; import net.minecraft.server.v1_4_R1.TileEntityEnderChest;
import net.minecraft.server.v1_4_R1.World; import net.minecraft.server.v1_4_R1.World;
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize()));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize()));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_4_R1;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_4_R1.IInventory; import net.minecraft.server.v1_4_R1.IInventory;
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_4_R1; package com.lishid.openinv.internal.v1_4_R1;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.minecraft.server.v1_4_R1.EntityPlayer; import net.minecraft.server.v1_4_R1.EntityPlayer;
import net.minecraft.server.v1_4_R1.MinecraftServer; import net.minecraft.server.v1_4_R1.MinecraftServer;
import net.minecraft.server.v1_4_R1.PlayerInteractManager; import net.minecraft.server.v1_4_R1.PlayerInteractManager;
// Volatile
import org.bukkit.craftbukkit.v1_4_R1.CraftServer; import org.bukkit.craftbukkit.v1_4_R1.CraftServer;
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -60,4 +64,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().f(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_4_R1; package com.lishid.openinv.internal.v1_4_R1;
// Volatile
import net.minecraft.server.v1_4_R1.ContainerChest; import net.minecraft.server.v1_4_R1.ContainerChest;
import net.minecraft.server.v1_4_R1.EntityHuman; import net.minecraft.server.v1_4_R1.EntityHuman;
import net.minecraft.server.v1_4_R1.IInventory; import net.minecraft.server.v1_4_R1.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_4_R1.EntityPlayer;
import net.minecraft.server.v1_4_R1.IInventory; import net.minecraft.server.v1_4_R1.IInventory;
import net.minecraft.server.v1_4_R1.InventoryEnderChest; import net.minecraft.server.v1_4_R1.InventoryEnderChest;
import net.minecraft.server.v1_4_R1.InventorySubcontainer; import net.minecraft.server.v1_4_R1.InventorySubcontainer;
@@ -46,12 +46,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -64,8 +64,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_4_R1.ItemStack; import net.minecraft.server.v1_4_R1.ItemStack;
import net.minecraft.server.v1_4_R1.PlayerInventory; import net.minecraft.server.v1_4_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_5_R2</artifactId> <artifactId>openinvadapter1_5_R2</artifactId>
<name>OpenInvAdapter1_5_R2</name> <name>OpenInvAdapter1_5_R2</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.5.1-R0.2</version> <version>1.5.1-R0.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_5_R2; package com.lishid.openinv.internal.v1_5_R2;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_5_R2.AxisAlignedBB; import net.minecraft.server.v1_5_R2.AxisAlignedBB;
import net.minecraft.server.v1_5_R2.BlockEnderChest; import net.minecraft.server.v1_5_R2.BlockEnderChest;
import net.minecraft.server.v1_5_R2.Container;
import net.minecraft.server.v1_5_R2.EntityOcelot; import net.minecraft.server.v1_5_R2.EntityOcelot;
import net.minecraft.server.v1_5_R2.EntityPlayer; import net.minecraft.server.v1_5_R2.EntityPlayer;
import net.minecraft.server.v1_5_R2.IInventory; import net.minecraft.server.v1_5_R2.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_5_R2.TileEntityChest;
import net.minecraft.server.v1_5_R2.TileEntityEnderChest; import net.minecraft.server.v1_5_R2.TileEntityEnderChest;
import net.minecraft.server.v1_5_R2.World; import net.minecraft.server.v1_5_R2.World;
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_5_R2.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize(), true));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_5_R2;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_5_R2.IInventory; import net.minecraft.server.v1_5_R2.IInventory;
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_5_R2; package com.lishid.openinv.internal.v1_5_R2;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_5_R2.EntityPlayer; import net.minecraft.server.v1_5_R2.EntityPlayer;
import net.minecraft.server.v1_5_R2.MinecraftServer; import net.minecraft.server.v1_5_R2.MinecraftServer;
import net.minecraft.server.v1_5_R2.PlayerInteractManager; import net.minecraft.server.v1_5_R2.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_5_R2.CraftServer; import org.bukkit.craftbukkit.v1_5_R2.CraftServer;
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -59,4 +63,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().f(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_5_R2; package com.lishid.openinv.internal.v1_5_R2;
// Volatile
import net.minecraft.server.v1_5_R2.ContainerChest; import net.minecraft.server.v1_5_R2.ContainerChest;
import net.minecraft.server.v1_5_R2.EntityHuman; import net.minecraft.server.v1_5_R2.EntityHuman;
import net.minecraft.server.v1_5_R2.IInventory; import net.minecraft.server.v1_5_R2.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_5_R2.EntityPlayer;
import net.minecraft.server.v1_5_R2.IInventory; import net.minecraft.server.v1_5_R2.IInventory;
import net.minecraft.server.v1_5_R2.InventoryEnderChest; import net.minecraft.server.v1_5_R2.InventoryEnderChest;
import net.minecraft.server.v1_5_R2.InventorySubcontainer; import net.minecraft.server.v1_5_R2.InventorySubcontainer;
@@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().c(), PlayerDataManager.getHandle(player).getEnderChest().c(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_5_R2.ItemStack; import net.minecraft.server.v1_5_R2.ItemStack;
import net.minecraft.server.v1_5_R2.PlayerInventory; import net.minecraft.server.v1_5_R2.PlayerInventory;
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_5_R3</artifactId> <artifactId>openinvadapter1_5_R3</artifactId>
<name>OpenInvAdapter1_5_R3</name> <name>OpenInvAdapter1_5_R3</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.5.2-R1.0</version> <version>1.5.2-R1.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_5_R3; package com.lishid.openinv.internal.v1_5_R3;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
//Volatile
import net.minecraft.server.v1_5_R3.AxisAlignedBB; import net.minecraft.server.v1_5_R3.AxisAlignedBB;
import net.minecraft.server.v1_5_R3.BlockEnderChest; import net.minecraft.server.v1_5_R3.BlockEnderChest;
import net.minecraft.server.v1_5_R3.Container;
import net.minecraft.server.v1_5_R3.EntityOcelot; import net.minecraft.server.v1_5_R3.EntityOcelot;
import net.minecraft.server.v1_5_R3.EntityPlayer; import net.minecraft.server.v1_5_R3.EntityPlayer;
import net.minecraft.server.v1_5_R3.IInventory; import net.minecraft.server.v1_5_R3.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_5_R3.TileEntityChest;
import net.minecraft.server.v1_5_R3.TileEntityEnderChest; import net.minecraft.server.v1_5_R3.TileEntityEnderChest;
import net.minecraft.server.v1_5_R3.World; import net.minecraft.server.v1_5_R3.World;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_5_R3.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize(), true));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_5_R3;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_5_R3.IInventory; import net.minecraft.server.v1_5_R3.IInventory;
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_5_R3; package com.lishid.openinv.internal.v1_5_R3;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_5_R3.EntityPlayer; import net.minecraft.server.v1_5_R3.EntityPlayer;
import net.minecraft.server.v1_5_R3.MinecraftServer; import net.minecraft.server.v1_5_R3.MinecraftServer;
import net.minecraft.server.v1_5_R3.PlayerInteractManager; import net.minecraft.server.v1_5_R3.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_5_R3.CraftServer; import org.bukkit.craftbukkit.v1_5_R3.CraftServer;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -59,4 +63,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_5_R3; package com.lishid.openinv.internal.v1_5_R3;
// Volatile
import net.minecraft.server.v1_5_R3.ContainerChest; import net.minecraft.server.v1_5_R3.ContainerChest;
import net.minecraft.server.v1_5_R3.EntityHuman; import net.minecraft.server.v1_5_R3.EntityHuman;
import net.minecraft.server.v1_5_R3.IInventory; import net.minecraft.server.v1_5_R3.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_5_R3.EntityPlayer;
import net.minecraft.server.v1_5_R3.IInventory; import net.minecraft.server.v1_5_R3.IInventory;
import net.minecraft.server.v1_5_R3.InventoryEnderChest; import net.minecraft.server.v1_5_R3.InventoryEnderChest;
import net.minecraft.server.v1_5_R3.InventorySubcontainer; import net.minecraft.server.v1_5_R3.InventorySubcontainer;
@@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().c(), PlayerDataManager.getHandle(player).getEnderChest().c(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_5_R3.ItemStack; import net.minecraft.server.v1_5_R3.ItemStack;
import net.minecraft.server.v1_5_R3.PlayerInventory; import net.minecraft.server.v1_5_R3.PlayerInventory;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_6_R1</artifactId> <artifactId>openinvadapter1_6_R1</artifactId>
<name>OpenInvAdapter1_6_R1</name> <name>OpenInvAdapter1_6_R1</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.6.1-R0.1-SNAPSHOT</version> <version>1.6.1-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_6_R1; package com.lishid.openinv.internal.v1_6_R1;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_6_R1.AxisAlignedBB; import net.minecraft.server.v1_6_R1.AxisAlignedBB;
import net.minecraft.server.v1_6_R1.BlockEnderChest; import net.minecraft.server.v1_6_R1.BlockEnderChest;
import net.minecraft.server.v1_6_R1.Container;
import net.minecraft.server.v1_6_R1.EntityOcelot; import net.minecraft.server.v1_6_R1.EntityOcelot;
import net.minecraft.server.v1_6_R1.EntityPlayer; import net.minecraft.server.v1_6_R1.EntityPlayer;
import net.minecraft.server.v1_6_R1.IInventory; import net.minecraft.server.v1_6_R1.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_6_R1.TileEntityChest;
import net.minecraft.server.v1_6_R1.TileEntityEnderChest; import net.minecraft.server.v1_6_R1.TileEntityEnderChest;
import net.minecraft.server.v1_6_R1.World; import net.minecraft.server.v1_6_R1.World;
import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R1.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize(), true));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_6_R1;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_6_R1.IInventory; import net.minecraft.server.v1_6_R1.IInventory;
import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_6_R1; package com.lishid.openinv.internal.v1_6_R1;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_6_R1.EntityPlayer; import net.minecraft.server.v1_6_R1.EntityPlayer;
import net.minecraft.server.v1_6_R1.MinecraftServer; import net.minecraft.server.v1_6_R1.MinecraftServer;
import net.minecraft.server.v1_6_R1.PlayerInteractManager; import net.minecraft.server.v1_6_R1.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R1.CraftServer; import org.bukkit.craftbukkit.v1_6_R1.CraftServer;
import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -59,4 +63,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_6_R1; package com.lishid.openinv.internal.v1_6_R1;
// Volatile
import net.minecraft.server.v1_6_R1.ContainerChest; import net.minecraft.server.v1_6_R1.ContainerChest;
import net.minecraft.server.v1_6_R1.EntityHuman; import net.minecraft.server.v1_6_R1.EntityHuman;
import net.minecraft.server.v1_6_R1.IInventory; import net.minecraft.server.v1_6_R1.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_6_R1.EntityPlayer;
import net.minecraft.server.v1_6_R1.IInventory; import net.minecraft.server.v1_6_R1.IInventory;
import net.minecraft.server.v1_6_R1.InventoryEnderChest; import net.minecraft.server.v1_6_R1.InventoryEnderChest;
import net.minecraft.server.v1_6_R1.InventorySubcontainer; import net.minecraft.server.v1_6_R1.InventorySubcontainer;
@@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().c(), PlayerDataManager.getHandle(player).getEnderChest().c(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_6_R1.ItemStack; import net.minecraft.server.v1_6_R1.ItemStack;
import net.minecraft.server.v1_6_R1.PlayerInventory; import net.minecraft.server.v1_6_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_6_R2</artifactId> <artifactId>openinvadapter1_6_R2</artifactId>
<name>OpenInvAdapter1_6_R2</name> <name>OpenInvAdapter1_6_R2</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.6.2-R1.0</version> <version>1.6.2-R1.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_6_R2; package com.lishid.openinv.internal.v1_6_R2;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_6_R2.AxisAlignedBB; import net.minecraft.server.v1_6_R2.AxisAlignedBB;
import net.minecraft.server.v1_6_R2.BlockEnderChest; import net.minecraft.server.v1_6_R2.BlockEnderChest;
import net.minecraft.server.v1_6_R2.Container;
import net.minecraft.server.v1_6_R2.EntityOcelot; import net.minecraft.server.v1_6_R2.EntityOcelot;
import net.minecraft.server.v1_6_R2.EntityPlayer; import net.minecraft.server.v1_6_R2.EntityPlayer;
import net.minecraft.server.v1_6_R2.IInventory; import net.minecraft.server.v1_6_R2.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_6_R2.TileEntityChest;
import net.minecraft.server.v1_6_R2.TileEntityEnderChest; import net.minecraft.server.v1_6_R2.TileEntityEnderChest;
import net.minecraft.server.v1_6_R2.World; import net.minecraft.server.v1_6_R2.World;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R2.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize(), true));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_6_R2;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_6_R2.IInventory; import net.minecraft.server.v1_6_R2.IInventory;
import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_6_R2; package com.lishid.openinv.internal.v1_6_R2;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_6_R2.EntityPlayer; import net.minecraft.server.v1_6_R2.EntityPlayer;
import net.minecraft.server.v1_6_R2.MinecraftServer; import net.minecraft.server.v1_6_R2.MinecraftServer;
import net.minecraft.server.v1_6_R2.PlayerInteractManager; import net.minecraft.server.v1_6_R2.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R2.CraftServer; import org.bukkit.craftbukkit.v1_6_R2.CraftServer;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -59,4 +63,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_6_R2; package com.lishid.openinv.internal.v1_6_R2;
// Volatile
import net.minecraft.server.v1_6_R2.ContainerChest; import net.minecraft.server.v1_6_R2.ContainerChest;
import net.minecraft.server.v1_6_R2.EntityHuman; import net.minecraft.server.v1_6_R2.EntityHuman;
import net.minecraft.server.v1_6_R2.IInventory; import net.minecraft.server.v1_6_R2.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_6_R2.EntityPlayer;
import net.minecraft.server.v1_6_R2.IInventory; import net.minecraft.server.v1_6_R2.IInventory;
import net.minecraft.server.v1_6_R2.InventoryEnderChest; import net.minecraft.server.v1_6_R2.InventoryEnderChest;
import net.minecraft.server.v1_6_R2.InventorySubcontainer; import net.minecraft.server.v1_6_R2.InventorySubcontainer;
@@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().c(), PlayerDataManager.getHandle(player).getEnderChest().c(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_6_R2.ItemStack; import net.minecraft.server.v1_6_R2.ItemStack;
import net.minecraft.server.v1_6_R2.PlayerInventory; import net.minecraft.server.v1_6_R2.PlayerInventory;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_6_R3</artifactId> <artifactId>openinvadapter1_6_R3</artifactId>
<name>OpenInvAdapter1_6_R3</name> <name>OpenInvAdapter1_6_R3</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.6.4-R2.0</version> <version>1.6.4-R2.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,17 +16,15 @@
package com.lishid.openinv.internal.v1_6_R3; package com.lishid.openinv.internal.v1_6_R3;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_6_R3.AxisAlignedBB; import net.minecraft.server.v1_6_R3.AxisAlignedBB;
import net.minecraft.server.v1_6_R3.BlockEnderChest; import net.minecraft.server.v1_6_R3.BlockEnderChest;
import net.minecraft.server.v1_6_R3.Container;
import net.minecraft.server.v1_6_R3.EntityOcelot; import net.minecraft.server.v1_6_R3.EntityOcelot;
import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.EntityPlayer;
import net.minecraft.server.v1_6_R3.IInventory; import net.minecraft.server.v1_6_R3.IInventory;
@@ -37,7 +35,7 @@ import net.minecraft.server.v1_6_R3.TileEntityChest;
import net.minecraft.server.v1_6_R3.TileEntityEnderChest; import net.minecraft.server.v1_6_R3.TileEntityEnderChest;
import net.minecraft.server.v1_6_R3.World; import net.minecraft.server.v1_6_R3.World;
import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -124,45 +122,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = world.getTypeId(block.getX(), block.getY(), block.getZ()); int id = world.getTypeId(block.getX(), block.getY(), block.getZ());
if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) { if (world.getTypeId(block.getX(), block.getY(), block.getZ() + 1) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) { } else if (world.getTypeId(block.getX(), block.getY(), block.getZ() - 1) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() + 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) { } else if (world.getTypeId(block.getX() - 1, block.getY(), block.getZ()) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) tile).getName(), ((IInventory) tile).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, inventory.getName(), inventory.getSize(), true));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_6_R3;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_6_R3.IInventory; import net.minecraft.server.v1_6_R3.IInventory;
import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory;

View File

@@ -16,18 +16,22 @@
package com.lishid.openinv.internal.v1_6_R3; package com.lishid.openinv.internal.v1_6_R3;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.EntityPlayer;
import net.minecraft.server.v1_6_R3.MinecraftServer; import net.minecraft.server.v1_6_R3.MinecraftServer;
import net.minecraft.server.v1_6_R3.PlayerInteractManager; import net.minecraft.server.v1_6_R3.PlayerInteractManager;
import org.bukkit.craftbukkit.v1_6_R3.CraftServer; import org.bukkit.craftbukkit.v1_6_R3.CraftServer;
import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -59,4 +63,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_6_R3; package com.lishid.openinv.internal.v1_6_R3;
// Volatile
import net.minecraft.server.v1_6_R3.ContainerChest; import net.minecraft.server.v1_6_R3.ContainerChest;
import net.minecraft.server.v1_6_R3.EntityHuman; import net.minecraft.server.v1_6_R3.EntityHuman;
import net.minecraft.server.v1_6_R3.IInventory; import net.minecraft.server.v1_6_R3.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_6_R3.EntityPlayer;
import net.minecraft.server.v1_6_R3.IInventory; import net.minecraft.server.v1_6_R3.IInventory;
import net.minecraft.server.v1_6_R3.InventoryEnderChest; import net.minecraft.server.v1_6_R3.InventoryEnderChest;
import net.minecraft.server.v1_6_R3.InventorySubcontainer; import net.minecraft.server.v1_6_R3.InventorySubcontainer;
@@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getName(), super(PlayerDataManager.getHandle(player).getEnderChest().getName(),
((CraftPlayer) p).getHandle().getEnderChest().c(), PlayerDataManager.getHandle(player).getEnderChest().c(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_6_R3.ItemStack; import net.minecraft.server.v1_6_R3.ItemStack;
import net.minecraft.server.v1_6_R3.PlayerInventory; import net.minecraft.server.v1_6_R3.PlayerInventory;
import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_7_R1</artifactId> <artifactId>openinvadapter1_7_R1</artifactId>
<name>OpenInvAdapter1_7_R1</name> <name>OpenInvAdapter1_7_R1</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.7.2-R0.4</version> <version>1.7.2-R0.4</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,18 +16,16 @@
package com.lishid.openinv.internal.v1_7_R1; package com.lishid.openinv.internal.v1_7_R1;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
//Volatile
import net.minecraft.server.v1_7_R1.AxisAlignedBB; import net.minecraft.server.v1_7_R1.AxisAlignedBB;
import net.minecraft.server.v1_7_R1.Block; import net.minecraft.server.v1_7_R1.Block;
import net.minecraft.server.v1_7_R1.BlockEnderChest; import net.minecraft.server.v1_7_R1.BlockEnderChest;
import net.minecraft.server.v1_7_R1.Container;
import net.minecraft.server.v1_7_R1.EntityOcelot; import net.minecraft.server.v1_7_R1.EntityOcelot;
import net.minecraft.server.v1_7_R1.EntityPlayer; import net.minecraft.server.v1_7_R1.EntityPlayer;
import net.minecraft.server.v1_7_R1.IInventory; import net.minecraft.server.v1_7_R1.IInventory;
@@ -38,7 +36,7 @@ import net.minecraft.server.v1_7_R1.TileEntityChest;
import net.minecraft.server.v1_7_R1.TileEntityEnderChest; import net.minecraft.server.v1_7_R1.TileEntityEnderChest;
import net.minecraft.server.v1_7_R1.World; import net.minecraft.server.v1_7_R1.World;
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -50,7 +48,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -98,7 +96,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -125,45 +123,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = Block.b(world.getType(block.getX(), block.getY(), block.getZ())); int id = Block.b(world.getType(block.getX(), block.getY(), block.getZ()));
if (Block.b(world.getType(block.getX(), block.getY(), block.getZ() + 1)) == id) { if (Block.b(world.getType(block.getX(), block.getY(), block.getZ() + 1)) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if(Block.b(world.getType(block.getX(), block.getY(), block.getZ() - 1)) == id) { } else if(Block.b(world.getType(block.getX(), block.getY(), block.getZ() - 1)) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (Block.b(world.getType(block.getX() + 1, block.getY(), block.getZ())) == id) { } else if (Block.b(world.getType(block.getX() + 1, block.getY(), block.getZ())) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (Block.b(world.getType(block.getX() - 1, block.getY(), block.getZ())) == id) { } else if (Block.b(world.getType(block.getX() - 1, block.getY(), block.getZ())) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) tile).getInventoryName(), ((IInventory) tile).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, inventory.getInventoryName(), inventory.getSize(), true));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_7_R1;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_7_R1.IInventory; import net.minecraft.server.v1_7_R1.IInventory;
import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory;

View File

@@ -16,19 +16,23 @@
package com.lishid.openinv.internal.v1_7_R1; package com.lishid.openinv.internal.v1_7_R1;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
// Volatile
import net.minecraft.server.v1_7_R1.EntityPlayer; import net.minecraft.server.v1_7_R1.EntityPlayer;
import net.minecraft.server.v1_7_R1.MinecraftServer; import net.minecraft.server.v1_7_R1.MinecraftServer;
import net.minecraft.server.v1_7_R1.PlayerInteractManager; import net.minecraft.server.v1_7_R1.PlayerInteractManager;
import net.minecraft.util.com.mojang.authlib.GameProfile; import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R1.CraftServer; import org.bukkit.craftbukkit.v1_7_R1.CraftServer;
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -60,4 +64,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_7_R1; package com.lishid.openinv.internal.v1_7_R1;
// Volatile
import net.minecraft.server.v1_7_R1.ContainerChest; import net.minecraft.server.v1_7_R1.ContainerChest;
import net.minecraft.server.v1_7_R1.EntityHuman; import net.minecraft.server.v1_7_R1.EntityHuman;
import net.minecraft.server.v1_7_R1.IInventory; import net.minecraft.server.v1_7_R1.IInventory;

View File

@@ -27,7 +27,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
// Volatile import net.minecraft.server.v1_7_R1.EntityPlayer;
import net.minecraft.server.v1_7_R1.IInventory; import net.minecraft.server.v1_7_R1.IInventory;
import net.minecraft.server.v1_7_R1.InventoryEnderChest; import net.minecraft.server.v1_7_R1.InventoryEnderChest;
import net.minecraft.server.v1_7_R1.InventorySubcontainer; import net.minecraft.server.v1_7_R1.InventorySubcontainer;
@@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
private CraftPlayer owner; private CraftPlayer owner;
private int maxStack = MAX_STACK; private int maxStack = MAX_STACK;
public SpecialEnderChest(Player p, Boolean online) { public SpecialEnderChest(Player player, Boolean online) {
super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), super(PlayerDataManager.getHandle(player).getEnderChest().getInventoryName(),
((CraftPlayer) p).getHandle().getEnderChest().k_(), PlayerDataManager.getHandle(player).getEnderChest().k_(),
((CraftPlayer) p).getHandle().getEnderChest().getSize()); PlayerDataManager.getHandle(player).getEnderChest().getSize());
CraftPlayer player = (CraftPlayer) p; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
this.enderChest = player.getHandle().getEnderChest(); this.enderChest = nmsPlayer.getEnderChest();
this.owner = player; this.owner = nmsPlayer.getBukkitEntity();
this.items = enderChest.getContents(); this.items = enderChest.getContents();
} }
@@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
try { try {
owner = (CraftPlayer) player; EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player);
InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); this.owner = nmsPlayer.getBukkitEntity();
InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest();
Field field = playerEnderChest.getClass().getField("items"); Field field = playerEnderChest.getClass().getField("items");
field.setAccessible(true); field.setAccessible(true);
field.set(playerEnderChest, this.items); field.set(playerEnderChest, this.items);

View File

@@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_7_R1.ItemStack; import net.minecraft.server.v1_7_R1.ItemStack;
import net.minecraft.server.v1_7_R1.PlayerInventory; import net.minecraft.server.v1_7_R1.PlayerInventory;
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
@@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
private boolean playerOnline = false; private boolean playerOnline = false;
public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) {
super(((CraftPlayer) bukkitPlayer).getHandle()); super(PlayerDataManager.getHandle(bukkitPlayer));
this.playerOnline = online; this.playerOnline = online;
this.items = player.inventory.items; this.items = player.inventory.items;
this.armor = player.inventory.armor; this.armor = player.inventory.armor;
@@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public void setPlayerOnline(Player player) { public void setPlayerOnline(Player player) {
if (!playerOnline) { if (!playerOnline) {
this.player = ((CraftPlayer) player).getHandle(); this.player = PlayerDataManager.getHandle(player);
this.player.inventory.items = this.items; this.player.inventory.items = this.items;
this.player.inventory.armor = this.armor; this.player.inventory.armor = this.armor;
playerOnline = true; playerOnline = true;

View File

@@ -4,25 +4,25 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinv</artifactId> <artifactId>openinvinternal</artifactId>
<version>1.0-SNAPSHOT</version> <version>3.1.2</version>
</parent> </parent>
<artifactId>openinvadapter1_7_R2</artifactId> <artifactId>openinvadapter1_7_R2</artifactId>
<name>OpenInvAdapter1_7_R2</name> <name>OpenInvAdapter1_7_R2</name>
<dependencies> <dependencies>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvplugin</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId> <artifactId>craftbukkit</artifactId>
<version>1.7.5-R0.1</version> <version>1.7.5-R0.1</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -16,18 +16,16 @@
package com.lishid.openinv.internal.v1_7_R2; package com.lishid.openinv.internal.v1_7_R2;
import java.lang.reflect.Field;
import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.IAnySilentContainer;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
//Volatile
import net.minecraft.server.v1_7_R2.AxisAlignedBB; import net.minecraft.server.v1_7_R2.AxisAlignedBB;
import net.minecraft.server.v1_7_R2.Block; import net.minecraft.server.v1_7_R2.Block;
import net.minecraft.server.v1_7_R2.BlockEnderChest; import net.minecraft.server.v1_7_R2.BlockEnderChest;
import net.minecraft.server.v1_7_R2.Container;
import net.minecraft.server.v1_7_R2.EntityOcelot; import net.minecraft.server.v1_7_R2.EntityOcelot;
import net.minecraft.server.v1_7_R2.EntityPlayer; import net.minecraft.server.v1_7_R2.EntityPlayer;
import net.minecraft.server.v1_7_R2.IInventory; import net.minecraft.server.v1_7_R2.IInventory;
@@ -38,7 +36,7 @@ import net.minecraft.server.v1_7_R2.TileEntityChest;
import net.minecraft.server.v1_7_R2.TileEntityEnderChest; import net.minecraft.server.v1_7_R2.TileEntityEnderChest;
import net.minecraft.server.v1_7_R2.World; import net.minecraft.server.v1_7_R2.World;
import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R2.event.CraftEventFactory;
public class AnySilentContainer implements IAnySilentContainer { public class AnySilentContainer implements IAnySilentContainer {
@@ -50,7 +48,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
World world = player.world; World world = player.world;
if (block instanceof BlockEnderChest) { if (block instanceof BlockEnderChest) {
@@ -98,7 +96,7 @@ public class AnySilentContainer implements IAnySilentContainer {
@Override @Override
public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) {
EntityPlayer player = ((CraftPlayer) p).getHandle(); EntityPlayer player = PlayerDataManager.getHandle(p);
// Silent ender chest is API-only // Silent ender chest is API-only
if (silentchest && block.getType() == Material.ENDER_CHEST) { if (silentchest && block.getType() == Material.ENDER_CHEST) {
@@ -125,45 +123,47 @@ public class AnySilentContainer implements IAnySilentContainer {
return false; return false;
} }
IInventory inventory = (IInventory) tile;
int id = Block.b(world.getType(block.getX(), block.getY(), block.getZ())); int id = Block.b(world.getType(block.getX(), block.getY(), block.getZ()));
if (Block.b(world.getType(block.getX(), block.getY(), block.getZ() + 1)) == id) { if (Block.b(world.getType(block.getX(), block.getY(), block.getZ() + 1)) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1)); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() + 1));
} else if(Block.b(world.getType(block.getX(), block.getY(), block.getZ() - 1)) == id) { } else if(Block.b(world.getType(block.getX(), block.getY(), block.getZ() - 1)) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX(), block.getY(), block.getZ() - 1), inventory);
} else if (Block.b(world.getType(block.getX() + 1, block.getY(), block.getZ())) == id) { } else if (Block.b(world.getType(block.getX() + 1, block.getY(), block.getZ())) == id) {
tile = new InventoryLargeChest("Large chest", (IInventory) tile, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ())); inventory = new InventoryLargeChest("container.chestDouble", inventory, (TileEntityChest) world.getTileEntity(block.getX() + 1, block.getY(), block.getZ()));
} else if (Block.b(world.getType(block.getX() - 1, block.getY(), block.getZ())) == id) { } else if (Block.b(world.getType(block.getX() - 1, block.getY(), block.getZ())) == id) {
tile = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), (IInventory) tile); inventory = new InventoryLargeChest("container.chestDouble", (TileEntityChest) world.getTileEntity(block.getX() - 1, block.getY(), block.getZ()), inventory);
} }
boolean returnValue = false; // AnyChest only
if (!silentchest) { if (!silentchest) {
player.openContainer((IInventory) tile); player.openContainer(inventory);
returnValue = true; return true;
} else {
try {
int windowId = 0;
try {
Field windowID = player.getClass().getDeclaredField("containerCounter");
windowID.setAccessible(true);
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
} catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) tile).getInventoryName(), ((IInventory) tile).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) tile));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
returnValue = true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
} }
return returnValue; // SilentChest
try {
// Call InventoryOpenEvent
Container container = new SilentContainerChest(player.inventory, inventory);
container = CraftEventFactory.callInventoryOpenEvent(player, container);
if (container == null) {
return false;
}
// Open window
int windowId = player.nextContainerCounter();
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, inventory.getInventoryName(), inventory.getSize(), true));
player.activeContainer = container;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
return true;
} catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent container.");
return false;
}
} }
} }

View File

@@ -19,11 +19,10 @@ package com.lishid.openinv.internal.v1_7_R2;
import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.util.InternalAccessor;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
// Volatile
import net.minecraft.server.v1_7_R2.IInventory; import net.minecraft.server.v1_7_R2.IInventory;
import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory;

View File

@@ -16,19 +16,23 @@
package com.lishid.openinv.internal.v1_7_R2; package com.lishid.openinv.internal.v1_7_R2;
import java.util.Arrays;
import java.util.Collection;
import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.IPlayerDataManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
//Volatile
import net.minecraft.server.v1_7_R2.EntityPlayer; import net.minecraft.server.v1_7_R2.EntityPlayer;
import net.minecraft.server.v1_7_R2.MinecraftServer; import net.minecraft.server.v1_7_R2.MinecraftServer;
import net.minecraft.server.v1_7_R2.PlayerInteractManager; import net.minecraft.server.v1_7_R2.PlayerInteractManager;
import net.minecraft.util.com.mojang.authlib.GameProfile; import net.minecraft.util.com.mojang.authlib.GameProfile;
import org.bukkit.craftbukkit.v1_7_R2.CraftServer; import org.bukkit.craftbukkit.v1_7_R2.CraftServer;
import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;
@SuppressWarnings("deprecation") // Deprecated methods are used properly and will not change. @SuppressWarnings("deprecation") // Deprecated methods are used properly and will not change.
public class PlayerDataManager implements IPlayerDataManager { public class PlayerDataManager implements IPlayerDataManager {
@@ -61,4 +65,39 @@ public class PlayerDataManager implements IPlayerDataManager {
return player.getName(); return player.getName();
} }
@Override
public OfflinePlayer getPlayerByID(String identifier) {
OfflinePlayer player = Bukkit.getOfflinePlayer(identifier);
// Ensure player is a real player, otherwise return null
if (player == null || !player.hasPlayedBefore() && !player.isOnline()) {
return null;
}
return player;
}
@Override
public Collection<? extends Player> getOnlinePlayers() {
return Arrays.asList(Bukkit.getOnlinePlayers());
}
public static EntityPlayer getHandle(Player player) {
if (player instanceof CraftPlayer) {
return ((CraftPlayer) player).getHandle();
}
Server server = player.getServer();
EntityPlayer nmsPlayer = null;
if (server instanceof CraftServer) {
nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
}
if (nmsPlayer == null) {
// Could use reflection to examine fields, but it's honestly not worth the bother.
throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
}
return nmsPlayer;
}
} }

View File

@@ -16,7 +16,6 @@
package com.lishid.openinv.internal.v1_7_R2; package com.lishid.openinv.internal.v1_7_R2;
// Volatile
import net.minecraft.server.v1_7_R2.ContainerChest; import net.minecraft.server.v1_7_R2.ContainerChest;
import net.minecraft.server.v1_7_R2.EntityHuman; import net.minecraft.server.v1_7_R2.EntityHuman;
import net.minecraft.server.v1_7_R2.IInventory; import net.minecraft.server.v1_7_R2.IInventory;

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