Compare commits

...

9 Commits

Author SHA1 Message Date
Jikoo
65c6eb2693 Bump version to 4.0.8 for release 2019-12-12 14:36:38 -05:00
Jikoo
ab1f4ace8a Fix AnyContainer breaking modified ender chest sizes 2019-12-12 14:33:42 -05:00
Jikoo
e7dc52bee4 Drop support for 1.13, latest 2 versions only. 2019-12-12 14:21:33 -05:00
Jikoo
a9c5799677 Merge branch 'master' of https://github.com/lishid/OpenInv 2019-12-12 13:59:38 -05:00
Andre LeBlanc
6d6257720a add support for 1.15 2019-12-12 13:59:12 -05:00
Andre LeBlanc
3e235fa688 add support for 1.15 2019-12-12 12:49:21 -05:00
Jikoo
dd02355ac2 Properly remove SilentContainer viewers
Closes #115
2019-12-03 13:50:27 -05:00
Jikoo
4d3f5d67a8 Update copyright
Practically should make it 2020 at this rate, whoops

(cherry picked from commit ff76f2b95a)
2019-12-03 13:32:41 -05:00
Jikoo
7ad5faa2ce Clean up maven instructions
(cherry picked from commit b92543e078)
2019-12-03 13:32:37 -05:00
43 changed files with 763 additions and 613 deletions

View File

@@ -132,15 +132,19 @@ OpenInv is a [Bukkit plugin](https://dev.bukkit.org/bukkit-plugins/openinv/) whi
## For Developers ## For Developers
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.8-R0.1-SNAPSHOT.jar -DgroupId=org.spigotmc -DartifactId=spigot -Dversion=1.8-R0.1-SNAPSHOT`
To compile for a specific version or set of versions, you'll need to use a profile. Provided profiles are `latest`, `recent` (last 2 major Minecraft versions), 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). To compile for a single version, specify the NMS revision you are targeting: `mvn -pl <NMS module> -am clean install`
The final file is target/OpenInv.jar To compile for a set of versions, you'll need to use a profile. The only provided profile is `all`. Select a profile using the `-P` argument: `mvn clean package -am -P all`
For more information, check out the [official Maven guide](http://maven.apache.org/guides/introduction/introduction-to-profiles.html).
The final file is `target/OpenInv.jar`
## License ## License
``` ```
Copyright (C) 2011-2018 lishid. All rights reserved. Copyright (C) 2011-2019 lishid. All rights reserved.
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvparent</artifactId> <artifactId>openinvparent</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvapi</artifactId> <artifactId>openinvapi</artifactId>

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -12,21 +12,6 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
* Copyright (C) 2014 - 2018 Simmetrics Authors
* Copyright (C) 2010 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ */
package com.lishid.openinv.util; package com.lishid.openinv.util;

View File

@@ -1,5 +1,5 @@
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvparent</artifactId> <artifactId>openinvparent</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvassembly</artifactId> <artifactId>openinvassembly</artifactId>

View File

@@ -1,5 +1,5 @@
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvparent</artifactId> <artifactId>openinvparent</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvcommon</artifactId> <artifactId>openinvcommon</artifactId>
@@ -31,7 +31,7 @@
<dependency> <dependency>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvapi</artifactId> <artifactId>openinvapi</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvparent</artifactId> <artifactId>openinvparent</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvinternal</artifactId> <artifactId>openinvinternal</artifactId>
@@ -30,28 +30,12 @@
<profiles> <profiles>
<profile>
<id>latest</id>
<modules>
<module>v1_14_R1</module>
</modules>
</profile>
<profile>
<id>recent</id>
<!-- The recent profile is for the most recent 2 versions. -->
<modules>
<module>v1_13_R2</module>
<module>v1_14_R1</module>
</modules>
</profile>
<profile> <profile>
<id>all</id> <id>all</id>
<modules> <modules>
<module>v1_8_R3</module> <module>v1_8_R3</module>
<module>v1_13_R2</module>
<module>v1_14_R1</module> <module>v1_14_R1</module>
<module>v1_15_R1</module>
</modules> </modules>
</profile> </profile>

View File

@@ -1,309 +0,0 @@
/*
* Copyright (C) 2011-2018 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_13_R2;
import com.lishid.openinv.internal.IAnySilentContainer;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import net.minecraft.server.v1_13_R2.AxisAlignedBB;
import net.minecraft.server.v1_13_R2.Block;
import net.minecraft.server.v1_13_R2.BlockChest;
import net.minecraft.server.v1_13_R2.BlockChestTrapped;
import net.minecraft.server.v1_13_R2.BlockEnderChest;
import net.minecraft.server.v1_13_R2.BlockPosition;
import net.minecraft.server.v1_13_R2.BlockPropertyChestType;
import net.minecraft.server.v1_13_R2.BlockShulkerBox;
import net.minecraft.server.v1_13_R2.ChatMessage;
import net.minecraft.server.v1_13_R2.Entity;
import net.minecraft.server.v1_13_R2.EntityOcelot;
import net.minecraft.server.v1_13_R2.EntityPlayer;
import net.minecraft.server.v1_13_R2.EnumDirection;
import net.minecraft.server.v1_13_R2.EnumGamemode;
import net.minecraft.server.v1_13_R2.IBlockData;
import net.minecraft.server.v1_13_R2.ITileInventory;
import net.minecraft.server.v1_13_R2.InventoryEnderChest;
import net.minecraft.server.v1_13_R2.InventoryLargeChest;
import net.minecraft.server.v1_13_R2.PlayerInteractManager;
import net.minecraft.server.v1_13_R2.TileEntity;
import net.minecraft.server.v1_13_R2.TileEntityChest;
import net.minecraft.server.v1_13_R2.TileEntityEnderChest;
import net.minecraft.server.v1_13_R2.TileEntityShulkerBox;
import net.minecraft.server.v1_13_R2.VoxelShape;
import net.minecraft.server.v1_13_R2.VoxelShapes;
import net.minecraft.server.v1_13_R2.World;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.jetbrains.annotations.NotNull;
public class AnySilentContainer implements IAnySilentContainer {
private Field playerInteractManagerGamemode;
public AnySilentContainer() {
try {
this.playerInteractManagerGamemode = PlayerInteractManager.class.getDeclaredField("gamemode");
this.playerInteractManagerGamemode.setAccessible(true);
} catch (NoSuchFieldException | SecurityException e) {
System.err.println("[OpenInv] Unable to directly write player gamemode! SilentChest will fail.");
e.printStackTrace();
}
}
@Override
public boolean isAnySilentContainer(@NotNull final org.bukkit.block.Block bukkitBlock) {
if (bukkitBlock.getType() == Material.ENDER_CHEST) {
return true;
}
BlockState state = bukkitBlock.getState();
return state instanceof org.bukkit.block.Chest
|| state instanceof org.bukkit.block.ShulkerBox;
}
@Override
public boolean isAnyContainerNeeded(@NotNull final Player bukkitPlayer, @NotNull final org.bukkit.block.Block bukkitBlock) {
World world = PlayerDataManager.getHandle(bukkitPlayer).world;
BlockPosition blockPosition = new BlockPosition(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ());
IBlockData blockData = world.getType(blockPosition);
Block block = blockData.getBlock();
if (block instanceof BlockShulkerBox) {
return this.isBlockedShulkerBox(world, blockPosition, blockData);
}
if (block instanceof BlockEnderChest) {
// Ender chests are not blocked by ocelots.
return world.getType(blockPosition.up()).isOccluding();
}
// Check if chest is blocked or has an ocelot on top
if (this.isBlockedChest(world, blockPosition)) {
return true;
}
// Check for matching adjacent chests that are blocked or have an ocelot on top
BlockPropertyChestType chestType = blockData.get(BlockChest.b);
if (chestType == BlockPropertyChestType.SINGLE) {
return false;
}
BlockPosition adjacentBlockPosition = blockPosition.shift(BlockChest.k(blockData));
IBlockData adjacentBlockData = world.getType(adjacentBlockPosition);
if (adjacentBlockData.getBlock() == block) {
BlockPropertyChestType adjacentChestType = adjacentBlockData.get(BlockChest.b);
if (adjacentChestType != BlockPropertyChestType.SINGLE && chestType != adjacentChestType
&& adjacentBlockData.get(BlockChest.FACING) == blockData.get(BlockChest.FACING)) {
return this.isBlockedChest(world, adjacentBlockPosition);
}
}
return false;
}
private boolean isBlockedShulkerBox(final World world, final BlockPosition blockPosition,
final IBlockData blockData) {
// For reference, look at net.minecraft.server.BlockShulkerBox
TileEntity tile = world.getTileEntity(blockPosition);
if (!(tile instanceof TileEntityShulkerBox)) {
return false;
}
EnumDirection enumDirection = blockData.get(BlockShulkerBox.a);
if (((TileEntityShulkerBox) tile).r() == TileEntityShulkerBox.AnimationPhase.CLOSED) {
AxisAlignedBB axisAlignedBB;
try {
Method method = VoxelShape.class.getMethod("a");
axisAlignedBB = (AxisAlignedBB) method.invoke(VoxelShapes.b());
} catch (NoSuchMethodException e) {
axisAlignedBB = VoxelShapes.b().getBoundingBox();
} catch (InvocationTargetException | IllegalAccessException e) {
return false;
}
axisAlignedBB = axisAlignedBB
.b(0.5F * enumDirection.getAdjacentX(), 0.5F * enumDirection.getAdjacentY(), 0.5F * enumDirection.getAdjacentZ())
.a(enumDirection.getAdjacentX(), enumDirection.getAdjacentY(), enumDirection.getAdjacentZ());
return !world.getCubes(null, axisAlignedBB.a(blockPosition.shift(enumDirection)));
}
return false;
}
private boolean isBlockedChest(final World world, final BlockPosition blockPosition) {
// For reference, loot at net.minecraft.server.BlockChest
return world.getType(blockPosition.up()).isOccluding() || this.hasOcelotOnTop(world, blockPosition);
}
private boolean hasOcelotOnTop(final World world, final BlockPosition blockPosition) {
for (Entity entity : world.a(EntityOcelot.class,
new AxisAlignedBB(blockPosition.getX(), blockPosition.getY() + 1,
blockPosition.getZ(), blockPosition.getX() + 1, blockPosition.getY() + 2,
blockPosition.getZ() + 1))) {
EntityOcelot entityOcelot = (EntityOcelot) entity;
if (entityOcelot.isSitting()) {
return true;
}
}
return false;
}
@Override
public boolean activateContainer(@NotNull final Player bukkitPlayer, final boolean silent,
@NotNull final org.bukkit.block.Block bukkitBlock) {
// Silent ender chest is API-only
if (silent && bukkitBlock.getType() == Material.ENDER_CHEST) {
bukkitPlayer.openInventory(bukkitPlayer.getEnderChest());
bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED);
return true;
}
EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer);
final World world = player.world;
final BlockPosition blockPosition = new BlockPosition(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ());
final Object tile = world.getTileEntity(blockPosition);
if (tile == null) {
return false;
}
if (tile instanceof TileEntityEnderChest) {
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
InventoryEnderChest enderChest = player.getEnderChest();
enderChest.a((TileEntityEnderChest) tile);
player.openContainer(enderChest);
bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED);
return true;
}
if (!(tile instanceof ITileInventory)) {
return false;
}
ITileInventory tileInventory = (ITileInventory) tile;
IBlockData blockData = world.getType(blockPosition);
Block block = blockData.getBlock();
if (block instanceof BlockChest) {
BlockPropertyChestType chestType = blockData.get(BlockChest.b);
if (chestType != BlockPropertyChestType.SINGLE) {
BlockPosition adjacentBlockPosition = blockPosition.shift(BlockChest.k(blockData));
IBlockData adjacentBlockData = world.getType(adjacentBlockPosition);
if (adjacentBlockData.getBlock() == block) {
BlockPropertyChestType adjacentChestType = adjacentBlockData.get(BlockChest.b);
if (adjacentChestType != BlockPropertyChestType.SINGLE && chestType != adjacentChestType
&& adjacentBlockData.get(BlockChest.FACING) == blockData.get(BlockChest.FACING)) {
TileEntity adjacentTile = world.getTileEntity(adjacentBlockPosition);
if (adjacentTile instanceof TileEntityChest) {
ITileInventory rightChest = chestType == BlockPropertyChestType.RIGHT ? tileInventory : (ITileInventory) adjacentTile;
ITileInventory leftChest = chestType == BlockPropertyChestType.RIGHT ? (ITileInventory) adjacentTile : tileInventory;
tileInventory = new InventoryLargeChest(new ChatMessage("container.chestDouble"), rightChest, leftChest);
}
}
}
}
if (block instanceof BlockChestTrapped) {
bukkitPlayer.incrementStatistic(Statistic.TRAPPED_CHEST_TRIGGERED);
} else {
bukkitPlayer.incrementStatistic(Statistic.CHEST_OPENED);
}
}
if (block instanceof BlockShulkerBox) {
bukkitPlayer.incrementStatistic(Statistic.SHULKER_BOX_OPENED);
}
// AnyChest only - SilentChest not active, container unsupported, or unnecessary.
if (!silent || player.playerInteractManager.getGameMode() == EnumGamemode.SPECTATOR) {
player.openContainer(tileInventory);
return true;
}
// SilentChest requires access to setting players' gamemode directly.
if (this.playerInteractManagerGamemode == null) {
return false;
}
EnumGamemode gamemode = player.playerInteractManager.getGameMode();
this.forceGameMode(player, EnumGamemode.SPECTATOR);
player.openContainer(tileInventory);
this.forceGameMode(player, gamemode);
return true;
}
@Override
public void deactivateContainer(@NotNull final Player bukkitPlayer) {
if (this.playerInteractManagerGamemode == null) {
return;
}
InventoryView view = bukkitPlayer.getOpenInventory();
switch (view.getType()) {
case CHEST:
case ENDER_CHEST:
case SHULKER_BOX:
break;
default:
return;
}
EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer);
EnumGamemode gamemode = player.playerInteractManager.getGameMode();
this.forceGameMode(player, EnumGamemode.SPECTATOR);
player.activeContainer.b(player);
player.activeContainer = player.defaultContainer;
this.forceGameMode(player, gamemode);
}
private void forceGameMode(final EntityPlayer player, final EnumGamemode gameMode) {
if (this.playerInteractManagerGamemode == null) {
// No need to warn repeatedly, error on startup and lack of function should be enough.
return;
}
try {
if (!this.playerInteractManagerGamemode.isAccessible()) {
// Just in case, ensure accessible.
this.playerInteractManagerGamemode.setAccessible(true);
}
this.playerInteractManagerGamemode.set(player.playerInteractManager, gameMode);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}

View File

@@ -1,85 +0,0 @@
/*
* Copyright (C) 2011-2018 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_13_R2;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.lishid.openinv.internal.ISpecialInventory;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_13_R2.DimensionManager;
import net.minecraft.server.v1_13_R2.EntityPlayer;
import net.minecraft.server.v1_13_R2.MinecraftServer;
import net.minecraft.server.v1_13_R2.PlayerInteractManager;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.craftbukkit.v1_13_R2.CraftServer;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.jetbrains.annotations.NotNull;
public class PlayerDataManager implements IPlayerDataManager {
public static EntityPlayer getHandle(final 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;
}
@Override
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
// Ensure player has data
if (!offline.hasPlayedBefore()) {
return null;
}
// Create a profile and entity to load the player data
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(DimensionManager.OVERWORLD), profile,
new PlayerInteractManager(server.getWorldServer(DimensionManager.OVERWORLD)));
// Get the bukkit entity
Player target = entity.getBukkitEntity();
if (target != null) {
// Load data
target.loadData();
}
// Return the entity
return target;
}
@Override
public InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory) {
return player.openInventory(inventory.getBukkitInventory());
}
}

View File

@@ -22,7 +22,7 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvinternal</artifactId> <artifactId>openinvinternal</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvadapter1_14_R1</artifactId> <artifactId>openinvadapter1_14_R1</artifactId>
@@ -38,7 +38,7 @@
<dependency> <dependency>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId> <artifactId>openinvcommon</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -29,6 +29,7 @@ import net.minecraft.server.v1_14_R1.BlockShulkerBox;
import net.minecraft.server.v1_14_R1.ChatMessage; import net.minecraft.server.v1_14_R1.ChatMessage;
import net.minecraft.server.v1_14_R1.Container; import net.minecraft.server.v1_14_R1.Container;
import net.minecraft.server.v1_14_R1.ContainerChest; import net.minecraft.server.v1_14_R1.ContainerChest;
import net.minecraft.server.v1_14_R1.Containers;
import net.minecraft.server.v1_14_R1.EntityHuman; import net.minecraft.server.v1_14_R1.EntityHuman;
import net.minecraft.server.v1_14_R1.EntityPlayer; import net.minecraft.server.v1_14_R1.EntityPlayer;
import net.minecraft.server.v1_14_R1.EnumChatFormat; import net.minecraft.server.v1_14_R1.EnumChatFormat;
@@ -189,8 +190,32 @@ public class AnySilentContainer implements IAnySilentContainer {
// Anychest ender chest. See net.minecraft.server.BlockEnderChest // Anychest ender chest. See net.minecraft.server.BlockEnderChest
InventoryEnderChest enderChest = player.getEnderChest(); InventoryEnderChest enderChest = player.getEnderChest();
enderChest.a((TileEntityEnderChest) tile); enderChest.a((TileEntityEnderChest) tile);
player.openContainer(new TileInventory((containerCounter, playerInventory, ignored) -> player.openContainer(new TileInventory((containerCounter, playerInventory, ignored) -> {
ContainerChest.a(containerCounter, playerInventory, enderChest), BlockEnderChest.d)); Containers containers;
int rows = enderChest.getSize() / 9;
switch (rows) {
case 1:
containers = Containers.GENERIC_9X1;
break;
case 2:
containers = Containers.GENERIC_9X2;
break;
case 3:
default:
containers = Containers.GENERIC_9X3;
break;
case 4:
containers = Containers.GENERIC_9X4;
break;
case 5:
containers = Containers.GENERIC_9X5;
break;
case 6:
containers = Containers.GENERIC_9X6;
break;
}
return new ContainerChest(containers, containerCounter, playerInventory, enderChest, rows);
}, BlockEnderChest.d));
bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED); bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED);
return true; return true;
} }
@@ -309,6 +334,8 @@ public class AnySilentContainer implements IAnySilentContainer {
EnumGamemode gamemode = player.playerInteractManager.getGameMode(); EnumGamemode gamemode = player.playerInteractManager.getGameMode();
this.forceGameMode(player, EnumGamemode.SPECTATOR); this.forceGameMode(player, EnumGamemode.SPECTATOR);
player.activeContainer.b(player); player.activeContainer.b(player);
player.activeContainer.a(player, false);
player.activeContainer.transferTo(player.defaultContainer, player.getBukkitEntity());
player.activeContainer = player.defaultContainer; player.activeContainer = player.defaultContainer;
this.forceGameMode(player, gamemode); this.forceGameMode(player, gamemode);
} }

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by
@@ -21,23 +22,23 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvinternal</artifactId> <artifactId>openinvinternal</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvadapter1_13_R2</artifactId> <artifactId>openinvadapter1_15_R1</artifactId>
<name>OpenInvAdapter1_13_R2</name> <name>OpenInvAdapter1_15_R1</name>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version> <version>1.15-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId> <artifactId>openinvcommon</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</dependency> </dependency>
</dependencies> </dependencies>
@@ -71,4 +72,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>

View File

@@ -0,0 +1,359 @@
/*
* Copyright (C) 2011-2019 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_15_R1;
import com.lishid.openinv.internal.IAnySilentContainer;
import java.lang.reflect.Field;
import net.minecraft.server.v1_15_R1.Block;
import net.minecraft.server.v1_15_R1.BlockBarrel;
import net.minecraft.server.v1_15_R1.BlockChest;
import net.minecraft.server.v1_15_R1.BlockChestTrapped;
import net.minecraft.server.v1_15_R1.BlockEnderChest;
import net.minecraft.server.v1_15_R1.BlockPosition;
import net.minecraft.server.v1_15_R1.BlockPropertyChestType;
import net.minecraft.server.v1_15_R1.BlockShulkerBox;
import net.minecraft.server.v1_15_R1.ChatMessage;
import net.minecraft.server.v1_15_R1.Container;
import net.minecraft.server.v1_15_R1.ContainerChest;
import net.minecraft.server.v1_15_R1.Containers;
import net.minecraft.server.v1_15_R1.EntityHuman;
import net.minecraft.server.v1_15_R1.EntityPlayer;
import net.minecraft.server.v1_15_R1.EnumChatFormat;
import net.minecraft.server.v1_15_R1.EnumGamemode;
import net.minecraft.server.v1_15_R1.IBlockData;
import net.minecraft.server.v1_15_R1.IChatBaseComponent;
import net.minecraft.server.v1_15_R1.ITileInventory;
import net.minecraft.server.v1_15_R1.InventoryEnderChest;
import net.minecraft.server.v1_15_R1.InventoryLargeChest;
import net.minecraft.server.v1_15_R1.PlayerInteractManager;
import net.minecraft.server.v1_15_R1.PlayerInventory;
import net.minecraft.server.v1_15_R1.TileEntity;
import net.minecraft.server.v1_15_R1.TileEntityChest;
import net.minecraft.server.v1_15_R1.TileEntityEnderChest;
import net.minecraft.server.v1_15_R1.TileEntityLootable;
import net.minecraft.server.v1_15_R1.TileInventory;
import net.minecraft.server.v1_15_R1.World;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.block.Barrel;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.EnderChest;
import org.bukkit.block.ShulkerBox;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Directional;
import org.bukkit.block.data.type.Chest;
import org.bukkit.entity.Cat;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.bukkit.util.BoundingBox;
import org.jetbrains.annotations.NotNull;
public class AnySilentContainer implements IAnySilentContainer {
private Field playerInteractManagerGamemode;
public AnySilentContainer() {
try {
this.playerInteractManagerGamemode = PlayerInteractManager.class.getDeclaredField("gamemode");
this.playerInteractManagerGamemode.setAccessible(true);
} catch (NoSuchFieldException | SecurityException e) {
System.err.println("[OpenInv] Unable to directly write player gamemode! SilentChest will fail.");
e.printStackTrace();
}
}
@Override
public boolean isAnySilentContainer(@NotNull final org.bukkit.block.Block bukkitBlock) {
if (bukkitBlock.getType() == Material.ENDER_CHEST) {
return true;
}
BlockState state = bukkitBlock.getState();
return state instanceof org.bukkit.block.Chest
|| state instanceof org.bukkit.block.ShulkerBox
|| state instanceof org.bukkit.block.Barrel;
}
@Override
public boolean isAnyContainerNeeded(@NotNull final Player p, @NotNull final org.bukkit.block.Block block) {
BlockState blockState = block.getState();
// Barrels do not require AnyContainer.
if (blockState instanceof Barrel) {
return false;
}
// Enderchests require a non-occluding block on top to open.
if (blockState instanceof EnderChest) {
return block.getRelative(0, 1, 0).getType().isOccluding();
}
// Shulker boxes require 1/2 a block clear in the direction they open.
if (blockState instanceof ShulkerBox) {
BoundingBox boundingBox = block.getBoundingBox();
if (boundingBox.getVolume() > 1) {
// Shulker box is already open.
return false;
}
BlockData blockData = block.getBlockData();
if (!(blockData instanceof Directional)) {
// Shouldn't be possible. Just in case, demand AnyChest.
return true;
}
Directional directional = (Directional) blockData;
BlockFace face = directional.getFacing();
boundingBox.shift(face.getDirection());
// Return whether or not bounding boxes overlap.
return block.getRelative(face, 1).getBoundingBox().overlaps(boundingBox);
}
if (!(blockState instanceof org.bukkit.block.Chest)) {
return false;
}
if (isBlockedChest(block)) {
return true;
}
BlockData blockData = block.getBlockData();
if (!(blockData instanceof Chest) || ((Chest) blockData).getType() == Chest.Type.SINGLE) {
return false;
}
Chest chest = (Chest) blockData;
int ordinal = (chest.getFacing().ordinal() + 4 + (chest.getType() == Chest.Type.RIGHT ? -1 : 1)) % 4;
BlockFace relativeFace = BlockFace.values()[ordinal];
org.bukkit.block.Block relative = block.getRelative(relativeFace);
if (relative.getType() != block.getType()) {
return false;
}
BlockData relativeData = relative.getBlockData();
if (!(relativeData instanceof Chest)) {
return false;
}
Chest relativeChest = (Chest) relativeData;
if (relativeChest.getFacing() != chest.getFacing()
|| relativeChest.getType() != (chest.getType() == Chest.Type.RIGHT ? Chest.Type.LEFT : Chest.Type.RIGHT)) {
return false;
}
return isBlockedChest(relative);
}
private boolean isBlockedChest(org.bukkit.block.Block block) {
org.bukkit.block.Block relative = block.getRelative(0, 1, 0);
return relative.getType().isOccluding()
|| block.getWorld().getNearbyEntities(BoundingBox.of(relative), entity -> entity instanceof Cat).size() > 0;
}
@Override
public boolean activateContainer(@NotNull final Player bukkitPlayer, final boolean silentchest,
@NotNull final org.bukkit.block.Block bukkitBlock) {
// Silent ender chest is API-only
if (silentchest && bukkitBlock.getType() == Material.ENDER_CHEST) {
bukkitPlayer.openInventory(bukkitPlayer.getEnderChest());
bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED);
return true;
}
EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer);
final World world = player.world;
final BlockPosition blockPosition = new BlockPosition(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ());
final TileEntity tile = world.getTileEntity(blockPosition);
if (tile == null) {
return false;
}
if (tile instanceof TileEntityEnderChest) {
// Anychest ender chest. See net.minecraft.server.BlockEnderChest
InventoryEnderChest enderChest = player.getEnderChest();
enderChest.a((TileEntityEnderChest) tile);
player.openContainer(new TileInventory((containerCounter, playerInventory, ignored) -> {
Containers containers;
int rows = enderChest.getSize() / 9;
switch (rows) {
case 1:
containers = Containers.GENERIC_9X1;
break;
case 2:
containers = Containers.GENERIC_9X2;
break;
case 3:
default:
containers = Containers.GENERIC_9X3;
break;
case 4:
containers = Containers.GENERIC_9X4;
break;
case 5:
containers = Containers.GENERIC_9X5;
break;
case 6:
containers = Containers.GENERIC_9X6;
break;
}
return new ContainerChest(containers, containerCounter, playerInventory, enderChest, rows);
}, BlockEnderChest.e));
bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED);
return true;
}
if (!(tile instanceof ITileInventory)) {
return false;
}
ITileInventory tileInventory = (ITileInventory) tile;
IBlockData blockData = world.getType(blockPosition);
Block block = blockData.getBlock();
if (block instanceof BlockChest) {
BlockPropertyChestType chestType = blockData.get(BlockChest.c);
if (chestType != BlockPropertyChestType.SINGLE) {
BlockPosition adjacentBlockPosition = blockPosition.shift(BlockChest.i(blockData));
IBlockData adjacentBlockData = world.getType(adjacentBlockPosition);
if (adjacentBlockData.getBlock() == block) {
BlockPropertyChestType adjacentChestType = adjacentBlockData.get(BlockChest.c);
if (adjacentChestType != BlockPropertyChestType.SINGLE && chestType != adjacentChestType
&& adjacentBlockData.get(BlockChest.FACING) == blockData.get(BlockChest.FACING)) {
TileEntity adjacentTile = world.getTileEntity(adjacentBlockPosition);
if (adjacentTile instanceof TileEntityChest && tileInventory instanceof TileEntityChest) {
TileEntityChest rightChest = chestType == BlockPropertyChestType.RIGHT ? ((TileEntityChest) tileInventory) : (TileEntityChest) adjacentTile;
TileEntityChest leftChest = chestType == BlockPropertyChestType.RIGHT ? (TileEntityChest) adjacentTile : ((TileEntityChest) tileInventory);
if (rightChest.lootTable != null || leftChest.lootTable != null) {
player.a(new ChatMessage("Loot not generated! Please disable /silentcontainer.").a(EnumChatFormat.RED), true);
return false;
}
tileInventory = new ITileInventory() {
public Container createMenu(int containerCounter, PlayerInventory playerInventory, EntityHuman entityHuman) {
leftChest.d(playerInventory.player);
rightChest.d(playerInventory.player);
return ContainerChest.b(containerCounter, playerInventory, new InventoryLargeChest(rightChest, leftChest));
}
public IChatBaseComponent getScoreboardDisplayName() {
return new ChatMessage("container.chestDouble");
}
};
}
}
}
}
if (block instanceof BlockChestTrapped) {
bukkitPlayer.incrementStatistic(Statistic.TRAPPED_CHEST_TRIGGERED);
} else {
bukkitPlayer.incrementStatistic(Statistic.CHEST_OPENED);
}
}
if (block instanceof BlockShulkerBox) {
bukkitPlayer.incrementStatistic(Statistic.SHULKER_BOX_OPENED);
}
if (block instanceof BlockBarrel) {
bukkitPlayer.incrementStatistic(Statistic.OPEN_BARREL);
}
// AnyChest only - SilentChest not active, container unsupported, or unnecessary.
if (!silentchest || player.playerInteractManager.getGameMode() == EnumGamemode.SPECTATOR) {
player.openContainer(tileInventory);
return true;
}
// SilentChest requires access to setting players' gamemode directly.
if (this.playerInteractManagerGamemode == null) {
return false;
}
if (tile instanceof TileEntityLootable) {
TileEntityLootable lootable = (TileEntityLootable) tile;
if (lootable.lootTable != null) {
player.a(new ChatMessage("Loot not generated! Please disable /silentcontainer.").a(EnumChatFormat.RED), true);
return false;
}
}
EnumGamemode gamemode = player.playerInteractManager.getGameMode();
this.forceGameMode(player, EnumGamemode.SPECTATOR);
player.openContainer(tileInventory);
this.forceGameMode(player, gamemode);
return true;
}
@Override
public void deactivateContainer(@NotNull final Player bukkitPlayer) {
if (this.playerInteractManagerGamemode == null) {
return;
}
InventoryView view = bukkitPlayer.getOpenInventory();
switch (view.getType()) {
case CHEST:
case ENDER_CHEST:
case SHULKER_BOX:
case BARREL:
break;
default:
return;
}
EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer);
EnumGamemode gamemode = player.playerInteractManager.getGameMode();
this.forceGameMode(player, EnumGamemode.SPECTATOR);
player.activeContainer.b(player);
player.activeContainer.a(player, false);
player.activeContainer.transferTo(player.defaultContainer, player.getBukkitEntity());
player.activeContainer = player.defaultContainer;
this.forceGameMode(player, gamemode);
}
private void forceGameMode(final EntityPlayer player, final EnumGamemode gameMode) {
if (this.playerInteractManagerGamemode == null) {
// No need to warn repeatedly, error on startup and lack of function should be enough.
return;
}
try {
if (!this.playerInteractManagerGamemode.isAccessible()) {
// Just in case, ensure accessible.
this.playerInteractManagerGamemode.setAccessible(true);
}
this.playerInteractManagerGamemode.set(player.playerInteractManager, gameMode);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,170 @@
/*
* Copyright (C) 2011-2019 lishid. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lishid.openinv.internal.v1_15_R1;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.lishid.openinv.internal.ISpecialInventory;
import com.mojang.authlib.GameProfile;
import net.minecraft.server.v1_15_R1.ChatComponentText;
import net.minecraft.server.v1_15_R1.Container;
import net.minecraft.server.v1_15_R1.Containers;
import net.minecraft.server.v1_15_R1.DimensionManager;
import net.minecraft.server.v1_15_R1.EntityHuman;
import net.minecraft.server.v1_15_R1.EntityPlayer;
import net.minecraft.server.v1_15_R1.MinecraftServer;
import net.minecraft.server.v1_15_R1.PacketPlayOutOpenWindow;
import net.minecraft.server.v1_15_R1.PlayerInteractManager;
import net.minecraft.server.v1_15_R1.PlayerInventory;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.Server;
import org.bukkit.craftbukkit.v1_15_R1.CraftServer;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_15_R1.event.CraftEventFactory;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftContainer;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.jetbrains.annotations.NotNull;
public class PlayerDataManager implements IPlayerDataManager {
public static EntityPlayer getHandle(final 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;
}
@Override
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
// Ensure player has data
if (!offline.hasPlayedBefore()) {
return null;
}
// Create a profile and entity to load the player data
GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());
MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(DimensionManager.OVERWORLD), profile,
new PlayerInteractManager(server.getWorldServer(DimensionManager.OVERWORLD)));
// Get the bukkit entity
Player target = entity.getBukkitEntity();
if (target != null) {
// Load data
target.loadData();
}
// Return the entity
return target;
}
@Override
public InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory) {
EntityPlayer nmsPlayer = getHandle(player);
if (nmsPlayer == null || nmsPlayer.playerConnection == null) {
return null;
}
String title;
if (inventory instanceof SpecialEnderChest) {
HumanEntity owner = (HumanEntity) ((SpecialEnderChest) inventory).getBukkitOwner();
title = (owner.getName() != null ? owner.getName() : owner.getUniqueId().toString()) + "'s Ender Chest";
} else if (inventory instanceof SpecialPlayerInventory) {
EntityHuman owner = ((PlayerInventory) inventory).player;
title = (owner.getName() != null ? owner.getName() : owner.getUniqueID().toString()) + "'s Inventory";
} else {
return player.openInventory(inventory.getBukkitInventory());
}
Container container = new CraftContainer(new InventoryView() {
@Override
public @NotNull Inventory getTopInventory() {
return inventory.getBukkitInventory();
}
@Override
public @NotNull Inventory getBottomInventory() {
return player.getInventory();
}
@Override
public @NotNull HumanEntity getPlayer() {
return player;
}
@Override
public @NotNull InventoryType getType() {
return inventory.getBukkitInventory().getType();
}
@Override
public @NotNull String getTitle() {
return title;
}
}, nmsPlayer, nmsPlayer.nextContainerCounter()) {
@Override
public Containers<?> getType() {
switch (inventory.getBukkitInventory().getSize()) {
case 9:
return Containers.GENERIC_9X1;
case 18:
return Containers.GENERIC_9X2;
case 27:
default:
return Containers.GENERIC_9X3;
case 36:
return Containers.GENERIC_9X4;
case 41: // PLAYER
case 45:
return Containers.GENERIC_9X5;
case 54:
return Containers.GENERIC_9X6;
}
}
};
container.setTitle(new ChatComponentText(title));
container = CraftEventFactory.callInventoryOpenEvent(nmsPlayer, container);
if (container == null) {
return null;
}
nmsPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(),
new ChatComponentText(container.getBukkitView().getTitle())));
nmsPlayer.activeContainer = container;
container.addSlotListener(nmsPlayer);
return container.getBukkitView();
}
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -14,50 +14,44 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.lishid.openinv.internal.v1_13_R2; package com.lishid.openinv.internal.v1_15_R1;
import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialEnderChest;
import java.util.List; import java.util.List;
import javax.annotation.Nullable; import net.minecraft.server.v1_15_R1.AutoRecipeStackManager;
import net.minecraft.server.v1_13_R2.AutoRecipeOutput; import net.minecraft.server.v1_15_R1.ContainerUtil;
import net.minecraft.server.v1_13_R2.AutoRecipeStackManager; import net.minecraft.server.v1_15_R1.EntityHuman;
import net.minecraft.server.v1_13_R2.ContainerUtil; import net.minecraft.server.v1_15_R1.EntityPlayer;
import net.minecraft.server.v1_13_R2.EntityHuman; import net.minecraft.server.v1_15_R1.IInventoryListener;
import net.minecraft.server.v1_13_R2.EntityPlayer; import net.minecraft.server.v1_15_R1.InventoryEnderChest;
import net.minecraft.server.v1_13_R2.IChatBaseComponent; import net.minecraft.server.v1_15_R1.ItemStack;
import net.minecraft.server.v1_13_R2.IInventory; import net.minecraft.server.v1_15_R1.NonNullList;
import net.minecraft.server.v1_13_R2.IInventoryListener;
import net.minecraft.server.v1_13_R2.InventoryEnderChest;
import net.minecraft.server.v1_13_R2.ItemStack;
import net.minecraft.server.v1_13_R2.NonNullList;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftHumanEntity; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftHumanEntity;
import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRecipeOutput { public class SpecialEnderChest extends InventoryEnderChest implements ISpecialEnderChest {
private EntityPlayer owner;
private final IChatBaseComponent displayName;
private final CraftInventory inventory; private final CraftInventory inventory;
private EntityPlayer owner;
private NonNullList<ItemStack> items; private NonNullList<ItemStack> items;
private boolean playerOnline; private boolean playerOnline;
public SpecialEnderChest(final Player player, final Boolean online) { public SpecialEnderChest(final Player player, final Boolean online) {
this.owner = PlayerDataManager.getHandle(player); super(PlayerDataManager.getHandle(player));
this.displayName = this.owner.getEnderChest().getDisplayName();
this.inventory = new CraftInventory(this); this.inventory = new CraftInventory(this);
this.items = this.owner.getEnderChest().items; this.owner = PlayerDataManager.getHandle(player);
this.playerOnline = online; this.playerOnline = online;
this.items = this.owner.getEnderChest().items;
} }
@Override @Override
public @NotNull Inventory getBukkitInventory() { public @NotNull CraftInventory getBukkitInventory() {
return this.inventory; return inventory;
} }
@Override @Override
@@ -90,46 +84,57 @@ public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRe
this.owner.getEnderChest().update(); this.owner.getEnderChest().update();
} }
@Override
public List<ItemStack> getContents() { public List<ItemStack> getContents() {
return this.items; return this.items;
} }
@Override
public void onOpen(CraftHumanEntity who) { public void onOpen(CraftHumanEntity who) {
this.owner.getEnderChest().onOpen(who); this.owner.getEnderChest().onOpen(who);
} }
@Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
this.owner.getEnderChest().onClose(who); this.owner.getEnderChest().onClose(who);
} }
@Override
public List<HumanEntity> getViewers() { public List<HumanEntity> getViewers() {
return this.owner.getEnderChest().getViewers(); return this.owner.getEnderChest().getViewers();
} }
@Override
public void setMaxStackSize(int i) { public void setMaxStackSize(int i) {
this.owner.getEnderChest().setMaxStackSize(i); this.owner.getEnderChest().setMaxStackSize(i);
} }
@Override
public InventoryHolder getOwner() { public InventoryHolder getOwner() {
return this.owner.getEnderChest().getOwner(); return this.owner.getEnderChest().getOwner();
} }
@Override
public Location getLocation() { public Location getLocation() {
return null; return null;
} }
@Override
public void a(IInventoryListener iinventorylistener) { public void a(IInventoryListener iinventorylistener) {
this.owner.getEnderChest().a(iinventorylistener); this.owner.getEnderChest().a(iinventorylistener);
} }
@Override
public void b(IInventoryListener iinventorylistener) { public void b(IInventoryListener iinventorylistener) {
this.owner.getEnderChest().b(iinventorylistener); this.owner.getEnderChest().b(iinventorylistener);
} }
@Override
public ItemStack getItem(int i) { public ItemStack getItem(int i) {
return i >= 0 && i < this.items.size() ? this.items.get(i) : ItemStack.a; return i >= 0 && i < this.items.size() ? this.items.get(i) : ItemStack.a;
} }
@Override
public ItemStack splitStack(int i, int j) { public ItemStack splitStack(int i, int j) {
ItemStack itemstack = ContainerUtil.a(this.items, i, j); ItemStack itemstack = ContainerUtil.a(this.items, i, j);
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
@@ -139,6 +144,7 @@ public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRe
return itemstack; return itemstack;
} }
@Override
public ItemStack a(ItemStack itemstack) { public ItemStack a(ItemStack itemstack) {
ItemStack itemstack1 = itemstack.cloneItemStack(); ItemStack itemstack1 = itemstack.cloneItemStack();
@@ -171,6 +177,7 @@ public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRe
return itemstack1; return itemstack1;
} }
@Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
ItemStack itemstack = this.items.get(i); ItemStack itemstack = this.items.get(i);
if (itemstack.isEmpty()) { if (itemstack.isEmpty()) {
@@ -181,6 +188,7 @@ public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRe
} }
} }
@Override
public void setItem(int i, ItemStack itemstack) { public void setItem(int i, ItemStack itemstack) {
this.items.set(i, itemstack); this.items.set(i, itemstack);
if (!itemstack.isEmpty() && itemstack.getCount() > this.getMaxStackSize()) { if (!itemstack.isEmpty() && itemstack.getCount() > this.getMaxStackSize()) {
@@ -190,11 +198,13 @@ public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRe
this.update(); this.update();
} }
@Override
public int getSize() { public int getSize() {
return this.owner.getEnderChest().getSize(); return this.owner.getEnderChest().getSize();
} }
public boolean P_() { @Override
public boolean isNotEmpty() {
for (ItemStack itemstack : this.items) { for (ItemStack itemstack : this.items) {
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
@@ -205,56 +215,35 @@ public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRe
return true; return true;
} }
public IChatBaseComponent getDisplayName() { @Override
return this.displayName;
}
@Nullable
public IChatBaseComponent getCustomName() {
return this.displayName;
}
public boolean hasCustomName() {
return false;
}
public void a(@Nullable IChatBaseComponent ichatbasecomponent) {
// Ignored - name is always player's name.
}
public int getMaxStackSize() { public int getMaxStackSize() {
return 64; return 64;
} }
@Override
public boolean a(EntityHuman entityhuman) { public boolean a(EntityHuman entityhuman) {
return true; return true;
} }
@Override
public void startOpen(EntityHuman entityhuman) { public void startOpen(EntityHuman entityhuman) {
} }
@Override
public void closeContainer(EntityHuman entityhuman) { public void closeContainer(EntityHuman entityhuman) {
} }
@Override
public boolean b(int i, ItemStack itemstack) { public boolean b(int i, ItemStack itemstack) {
return true; return true;
} }
public int getProperty(int i) { @Override
return 0;
}
public void setProperty(int i, int j) {
}
public int h() {
return 0;
}
public void clear() { public void clear() {
this.items.clear(); this.items.clear();
} }
@Override
public void a(AutoRecipeStackManager autorecipestackmanager) { public void a(AutoRecipeStackManager autorecipestackmanager) {
for (ItemStack itemstack : this.items) { for (ItemStack itemstack : this.items) {

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -14,53 +14,56 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.lishid.openinv.internal.v1_13_R2; package com.lishid.openinv.internal.v1_15_R1;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
import javax.annotation.Nullable; import java.util.stream.Collectors;
import net.minecraft.server.v1_13_R2.AutoRecipeStackManager; import net.minecraft.server.v1_15_R1.AutoRecipeStackManager;
import net.minecraft.server.v1_13_R2.ChatMessage; import net.minecraft.server.v1_15_R1.ChatMessage;
import net.minecraft.server.v1_13_R2.ContainerUtil; import net.minecraft.server.v1_15_R1.ContainerUtil;
import net.minecraft.server.v1_13_R2.CrashReport; import net.minecraft.server.v1_15_R1.CrashReport;
import net.minecraft.server.v1_13_R2.CrashReportSystemDetails; import net.minecraft.server.v1_15_R1.CrashReportSystemDetails;
import net.minecraft.server.v1_13_R2.EntityHuman; import net.minecraft.server.v1_15_R1.EntityHuman;
import net.minecraft.server.v1_13_R2.EntityPlayer; import net.minecraft.server.v1_15_R1.EntityPlayer;
import net.minecraft.server.v1_13_R2.IBlockData; import net.minecraft.server.v1_15_R1.EnumItemSlot;
import net.minecraft.server.v1_13_R2.IChatBaseComponent; import net.minecraft.server.v1_15_R1.IBlockData;
import net.minecraft.server.v1_13_R2.Item; import net.minecraft.server.v1_15_R1.IChatBaseComponent;
import net.minecraft.server.v1_13_R2.ItemArmor; import net.minecraft.server.v1_15_R1.Item;
import net.minecraft.server.v1_13_R2.ItemStack; import net.minecraft.server.v1_15_R1.ItemArmor;
import net.minecraft.server.v1_13_R2.NBTTagCompound; import net.minecraft.server.v1_15_R1.ItemStack;
import net.minecraft.server.v1_13_R2.NBTTagList; import net.minecraft.server.v1_15_R1.NBTTagCompound;
import net.minecraft.server.v1_13_R2.NonNullList; import net.minecraft.server.v1_15_R1.NBTTagList;
import net.minecraft.server.v1_13_R2.PacketPlayOutSetSlot; import net.minecraft.server.v1_15_R1.NonNullList;
import net.minecraft.server.v1_13_R2.PlayerInventory; import net.minecraft.server.v1_15_R1.PacketPlayOutSetSlot;
import net.minecraft.server.v1_13_R2.ReportedException; import net.minecraft.server.v1_15_R1.PlayerInventory;
import net.minecraft.server.v1_13_R2.World; import net.minecraft.server.v1_15_R1.ReportedException;
import net.minecraft.server.v1_15_R1.World;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftHumanEntity; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftHumanEntity;
import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventory; import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftInventory;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
private final CraftInventory inventory = new CraftInventory(this); private final CraftInventory inventory;
private boolean playerOnline; private boolean playerOnline;
private EntityHuman player;
private NonNullList<ItemStack> items, armor, extraSlots; private NonNullList<ItemStack> items, armor, extraSlots;
private List<NonNullList<ItemStack>> f; private List<NonNullList<ItemStack>> f;
public SpecialPlayerInventory(final Player bukkitPlayer, final Boolean online) { public SpecialPlayerInventory(final Player bukkitPlayer, final Boolean online) {
super(PlayerDataManager.getHandle(bukkitPlayer)); super(PlayerDataManager.getHandle(bukkitPlayer));
this.inventory = new CraftInventory(this);
this.playerOnline = online; this.playerOnline = online;
this.player = super.player;
this.items = this.player.inventory.items; this.items = this.player.inventory.items;
this.armor = this.player.inventory.armor; this.armor = this.player.inventory.armor;
this.extraSlots = this.player.inventory.extraSlots; this.extraSlots = this.player.inventory.extraSlots;
@@ -91,8 +94,8 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override @Override
public @NotNull Inventory getBukkitInventory() { public @NotNull CraftInventory getBukkitInventory() {
return inventory; return this.inventory;
} }
@Override @Override
@@ -168,7 +171,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public int getSize() { public int getSize() {
return super.getSize() + 4; return 45;
} }
@Override @Override
@@ -209,7 +212,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public ItemStack splitStack(int i, final int j) { public ItemStack splitStack(int i, final int j) {
NonNullList<ItemStack> list = this.items; List<ItemStack> list = this.items;
if (i >= list.size()) { if (i >= list.size()) {
i -= list.size(); i -= list.size();
@@ -234,7 +237,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
@Override @Override
public ItemStack splitWithoutUpdate(int i) { public ItemStack splitWithoutUpdate(int i) {
NonNullList<ItemStack> list = this.items; List<ItemStack> list = this.items;
if (i >= list.size()) { if (i >= list.size()) {
i -= list.size(); i -= list.size();
@@ -264,46 +267,44 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
return ItemStack.a; return ItemStack.a;
} }
@Override
public List<ItemStack> getContents() { public List<ItemStack> getContents() {
List<ItemStack> combined = new ArrayList<>(this.items.size() + this.armor.size() + this.extraSlots.size()); return this.f.stream().flatMap(List::stream).collect(Collectors.toList());
for (List<ItemStack> sub : this.f) {
combined.addAll(sub);
}
return combined;
} }
@Override
public List<ItemStack> getArmorContents() { public List<ItemStack> getArmorContents() {
return this.armor; return this.armor;
} }
@Override
public void onOpen(CraftHumanEntity who) { public void onOpen(CraftHumanEntity who) {
this.transaction.add(who); this.transaction.add(who);
} }
@Override
public void onClose(CraftHumanEntity who) { public void onClose(CraftHumanEntity who) {
this.transaction.remove(who); this.transaction.remove(who);
} }
@Override
public List<HumanEntity> getViewers() { public List<HumanEntity> getViewers() {
return this.transaction; return this.transaction;
} }
@Override
public InventoryHolder getOwner() { public InventoryHolder getOwner() {
return this.player.getBukkitEntity(); return this.player.getBukkitEntity();
} }
@Override
public Location getLocation() { public Location getLocation() {
return this.player.getBukkitEntity().getLocation(); return this.player.getBukkitEntity().getLocation();
} }
@Override
public ItemStack getItemInHand() { public ItemStack getItemInHand() {
return e(this.itemInHandIndex) ? this.items.get(this.itemInHandIndex) : ItemStack.a; return d(this.itemInHandIndex) ? this.items.get(this.itemInHandIndex) : ItemStack.a;
}
public static int getHotbarSize() {
return 9;
} }
private boolean a(ItemStack itemstack, ItemStack itemstack1) { private boolean a(ItemStack itemstack, ItemStack itemstack1) {
@@ -314,10 +315,11 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
return itemstack.getItem() == itemstack1.getItem() && ItemStack.equals(itemstack, itemstack1); return itemstack.getItem() == itemstack1.getItem() && ItemStack.equals(itemstack, itemstack1);
} }
@Override
public int canHold(ItemStack itemstack) { public int canHold(ItemStack itemstack) {
int remains = itemstack.getCount(); int remains = itemstack.getCount();
for(int i = 0; i < this.items.size(); ++i) { for (int i = 0; i < this.items.size(); ++i) {
ItemStack itemstack1 = this.getItem(i); ItemStack itemstack1 = this.getItem(i);
if (itemstack1.isEmpty()) { if (itemstack1.isEmpty()) {
return itemstack.getCount(); return itemstack.getCount();
@@ -335,8 +337,9 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
return itemstack.getCount() - remains; return itemstack.getCount() - remains;
} }
@Override
public int getFirstEmptySlotIndex() { public int getFirstEmptySlotIndex() {
for(int i = 0; i < this.items.size(); ++i) { for (int i = 0; i < this.items.size(); ++i) {
if (this.items.get(i).isEmpty()) { if (this.items.get(i).isEmpty()) {
return i; return i;
} }
@@ -345,19 +348,17 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
return -1; return -1;
} }
public void d(int i) { @Override
this.itemInHandIndex = this.l(); public void c(int i) {
this.itemInHandIndex = this.i();
ItemStack itemstack = this.items.get(this.itemInHandIndex); ItemStack itemstack = this.items.get(this.itemInHandIndex);
this.items.set(this.itemInHandIndex, this.items.get(i)); this.items.set(this.itemInHandIndex, this.items.get(i));
this.items.set(i, itemstack); this.items.set(i, itemstack);
} }
public static boolean e(int i) { @Override
return i >= 0 && i < 9;
}
public int c(ItemStack itemstack) { public int c(ItemStack itemstack) {
for(int i = 0; i < this.items.size(); ++i) { for (int i = 0; i < this.items.size(); ++i) {
ItemStack itemstack1 = this.items.get(i); ItemStack itemstack1 = this.items.get(i);
if (!this.items.get(i).isEmpty() && this.b(itemstack, this.items.get(i)) && !this.items.get(i).f() && !itemstack1.hasEnchantments() && !itemstack1.hasName()) { if (!this.items.get(i).isEmpty() && this.b(itemstack, this.items.get(i)) && !this.items.get(i).f() && !itemstack1.hasEnchantments() && !itemstack1.hasName()) {
return i; return i;
@@ -367,17 +368,18 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
return -1; return -1;
} }
public int l() { @Override
public int i() {
int i; int i;
int j; int j;
for(j = 0; j < 9; ++j) { for (j = 0; j < 9; ++j) {
i = (this.itemInHandIndex + j) % 9; i = (this.itemInHandIndex + j) % 9;
if (this.items.get(i).isEmpty()) { if (this.items.get(i).isEmpty()) {
return i; return i;
} }
} }
for(j = 0; j < 9; ++j) { for (j = 0; j < 9; ++j) {
i = (this.itemInHandIndex + j) % 9; i = (this.itemInHandIndex + j) % 9;
if (!this.items.get(i).hasEnchantments()) { if (!this.items.get(i).hasEnchantments()) {
return i; return i;
@@ -387,11 +389,12 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
return this.itemInHandIndex; return this.itemInHandIndex;
} }
@Override
public int a(Predicate<ItemStack> predicate, int i) { public int a(Predicate<ItemStack> predicate, int i) {
int j = 0; int j = 0;
int k; int k;
for(k = 0; k < this.getSize(); ++k) { for (k = 0; k < this.getSize(); ++k) {
ItemStack itemstack = this.getItem(k); ItemStack itemstack = this.getItem(k);
if (!itemstack.isEmpty() && predicate.test(itemstack)) { if (!itemstack.isEmpty() && predicate.test(itemstack)) {
int l = i <= 0 ? itemstack.getCount() : Math.min(i - j, itemstack.getCount()); int l = i <= 0 ? itemstack.getCount() : Math.min(i - j, itemstack.getCount());
@@ -468,13 +471,14 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
} }
@Override
public int firstPartial(ItemStack itemstack) { public int firstPartial(ItemStack itemstack) {
if (this.a(this.getItem(this.itemInHandIndex), itemstack)) { if (this.a(this.getItem(this.itemInHandIndex), itemstack)) {
return this.itemInHandIndex; return this.itemInHandIndex;
} else if (this.a(this.getItem(40), itemstack)) { } else if (this.a(this.getItem(40), itemstack)) {
return 40; return 40;
} else { } else {
for(int i = 0; i < this.items.size(); ++i) { for (int i = 0; i < this.items.size(); ++i) {
if (this.a(this.items.get(i), itemstack)) { if (this.a(this.items.get(i), itemstack)) {
return i; return i;
} }
@@ -484,9 +488,10 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
} }
public void p() { @Override
public void j() {
for (NonNullList<ItemStack> itemStacks : this.f) { for (List<ItemStack> itemStacks : this.f) {
for (int i = 0; i < itemStacks.size(); ++i) { for (int i = 0; i < itemStacks.size(); ++i) {
if (!itemStacks.get(i).isEmpty()) { if (!itemStacks.get(i).isEmpty()) {
itemStacks.get(i).a(this.player.world, this.player, i, this.itemInHandIndex == i); itemStacks.get(i).a(this.player.world, this.player, i, this.itemInHandIndex == i);
@@ -496,10 +501,12 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override
public boolean pickup(ItemStack itemstack) { public boolean pickup(ItemStack itemstack) {
return this.c(-1, itemstack); return this.c(-1, itemstack);
} }
@Override
public boolean c(int i, ItemStack itemstack) { public boolean c(int i, ItemStack itemstack) {
if (itemstack.isEmpty()) { if (itemstack.isEmpty()) {
return false; return false;
@@ -550,6 +557,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
} }
@Override
public void a(World world, ItemStack itemstack) { public void a(World world, ItemStack itemstack) {
if (!world.isClientSide) { if (!world.isClientSide) {
while(!itemstack.isEmpty()) { while(!itemstack.isEmpty()) {
@@ -572,26 +580,29 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Override
public void f(ItemStack itemstack) { public void f(ItemStack itemstack) {
for (NonNullList<ItemStack> nonnulllist : this.f) { for (List<ItemStack> list : this.f) {
for (int i = 0; i < nonnulllist.size(); ++i) { for (int i = 0; i < list.size(); ++i) {
if (nonnulllist.get(i) == itemstack) { if (list.get(i) == itemstack) {
nonnulllist.set(i, ItemStack.a); list.set(i, ItemStack.a);
break; break;
} }
} }
} }
} }
@Override
public float a(IBlockData iblockdata) { public float a(IBlockData iblockdata) {
return this.items.get(this.itemInHandIndex).a(iblockdata); return this.items.get(this.itemInHandIndex).a(iblockdata);
} }
@Override
public NBTTagList a(NBTTagList nbttaglist) { public NBTTagList a(NBTTagList nbttaglist) {
NBTTagCompound nbttagcompound; NBTTagCompound nbttagcompound;
int i; int i;
for(i = 0; i < this.items.size(); ++i) { for (i = 0; i < this.items.size(); ++i) {
if (!this.items.get(i).isEmpty()) { if (!this.items.get(i).isEmpty()) {
nbttagcompound = new NBTTagCompound(); nbttagcompound = new NBTTagCompound();
nbttagcompound.setByte("Slot", (byte) i); nbttagcompound.setByte("Slot", (byte) i);
@@ -600,7 +611,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
} }
for(i = 0; i < this.armor.size(); ++i) { for (i = 0; i < this.armor.size(); ++i) {
if (!this.armor.get(i).isEmpty()) { if (!this.armor.get(i).isEmpty()) {
nbttagcompound = new NBTTagCompound(); nbttagcompound = new NBTTagCompound();
nbttagcompound.setByte("Slot", (byte) (i + 100)); nbttagcompound.setByte("Slot", (byte) (i + 100));
@@ -609,7 +620,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
} }
for(i = 0; i < this.extraSlots.size(); ++i) { for (i = 0; i < this.extraSlots.size(); ++i) {
if (!this.extraSlots.get(i).isEmpty()) { if (!this.extraSlots.get(i).isEmpty()) {
nbttagcompound = new NBTTagCompound(); nbttagcompound = new NBTTagCompound();
nbttagcompound.setByte("Slot", (byte) (i + 150)); nbttagcompound.setByte("Slot", (byte) (i + 150));
@@ -621,6 +632,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
return nbttaglist; return nbttaglist;
} }
@Override
public void b(NBTTagList nbttaglist) { public void b(NBTTagList nbttaglist) {
this.items.clear(); this.items.clear();
this.armor.clear(); this.armor.clear();
@@ -643,11 +655,12 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
public boolean P_() { @Override
public boolean isNotEmpty() {
Iterator iterator = this.items.iterator(); Iterator iterator = this.items.iterator();
ItemStack itemstack; ItemStack itemstack;
while(iterator.hasNext()) { while (iterator.hasNext()) {
itemstack = (ItemStack)iterator.next(); itemstack = (ItemStack)iterator.next();
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
return false; return false;
@@ -656,7 +669,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
iterator = this.armor.iterator(); iterator = this.armor.iterator();
while(iterator.hasNext()) { while (iterator.hasNext()) {
itemstack = (ItemStack)iterator.next(); itemstack = (ItemStack)iterator.next();
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
return false; return false;
@@ -665,7 +678,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
iterator = this.extraSlots.iterator(); iterator = this.extraSlots.iterator();
while(iterator.hasNext()) { while (iterator.hasNext()) {
itemstack = (ItemStack)iterator.next(); itemstack = (ItemStack)iterator.next();
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
return false; return false;
@@ -676,14 +689,17 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
@Nullable @Nullable
@Override
public IChatBaseComponent getCustomName() { public IChatBaseComponent getCustomName() {
return null; return null;
} }
@Override
public boolean b(IBlockData iblockdata) { public boolean b(IBlockData iblockdata) {
return this.getItem(this.itemInHandIndex).b(iblockdata); return this.getItem(this.itemInHandIndex).canDestroySpecialBlock(iblockdata);
} }
@Override
public void a(float f) { public void a(float f) {
if (f > 0.0F) { if (f > 0.0F) {
f /= 4.0F; f /= 4.0F;
@@ -691,16 +707,19 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
f = 1.0F; f = 1.0F;
} }
for (ItemStack itemstack : this.armor) { for (int i = 0; i < this.armor.size(); ++i) {
ItemStack itemstack = this.armor.get(0);
int index = i;
if (itemstack.getItem() instanceof ItemArmor) { if (itemstack.getItem() instanceof ItemArmor) {
itemstack.damage((int) f, this.player); itemstack.damage((int) f, this.player, (entityhuman) -> entityhuman.c(EnumItemSlot.a(EnumItemSlot.Function.ARMOR, index)));
} }
} }
} }
} }
@Override
public void dropContents() { public void dropContents() {
for (NonNullList<ItemStack> itemStacks : this.f) { for (List<ItemStack> itemStacks : this.f) {
for (int i = 0; i < itemStacks.size(); ++i) { for (int i = 0; i < itemStacks.size(); ++i) {
ItemStack itemstack = itemStacks.get(i); ItemStack itemstack = itemStacks.get(i);
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
@@ -711,10 +730,12 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
} }
} }
@Override
public boolean h(ItemStack itemstack) { public boolean h(ItemStack itemstack) {
return this.f.stream().flatMap(NonNullList::stream).anyMatch(itemStack1 -> !itemStack1.isEmpty() && itemStack1.doMaterialsMatch(itemstack)); return this.f.stream().flatMap(List::stream).anyMatch(itemStack1 -> !itemStack1.isEmpty() && itemStack1.doMaterialsMatch(itemstack));
} }
@Override
public void a(PlayerInventory playerinventory) { public void a(PlayerInventory playerinventory) {
for (int i = 0; i < playerinventory.getSize(); ++i) { for (int i = 0; i < playerinventory.getSize(); ++i) {
this.setItem(i, playerinventory.getItem(i)); this.setItem(i, playerinventory.getItem(i));
@@ -723,10 +744,12 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP
this.itemInHandIndex = playerinventory.itemInHandIndex; this.itemInHandIndex = playerinventory.itemInHandIndex;
} }
@Override
public void clear() { public void clear() {
this.f.forEach(NonNullList::clear); this.f.forEach(List::clear);
} }
@Override
public void a(AutoRecipeStackManager autorecipestackmanager) { public void a(AutoRecipeStackManager autorecipestackmanager) {
for (ItemStack itemstack : this.items) { for (ItemStack itemstack : this.items) {
autorecipestackmanager.a(itemstack); autorecipestackmanager.a(itemstack);

View File

@@ -1,5 +1,5 @@
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvinternal</artifactId> <artifactId>openinvinternal</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvadapter1_8_R3</artifactId> <artifactId>openinvadapter1_8_R3</artifactId>
@@ -37,7 +37,7 @@
<dependency> <dependency>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId> <artifactId>openinvcommon</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -225,6 +225,8 @@ public class AnySilentContainer implements IAnySilentContainer {
EnumGamemode gamemode = player.playerInteractManager.getGameMode(); EnumGamemode gamemode = player.playerInteractManager.getGameMode();
this.forceGameMode(player, EnumGamemode.SPECTATOR); this.forceGameMode(player, EnumGamemode.SPECTATOR);
player.activeContainer.b(player); player.activeContainer.b(player);
player.activeContainer.a(player, false);
player.activeContainer.transferTo(player.defaultContainer, player.getBukkitEntity());
player.activeContainer = player.defaultContainer; player.activeContainer = player.defaultContainer;
this.forceGameMode(player, gamemode); this.forceGameMode(player, gamemode);
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -21,7 +21,7 @@
<parent> <parent>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvparent</artifactId> <artifactId>openinvparent</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</parent> </parent>
<artifactId>openinvplugincore</artifactId> <artifactId>openinvplugincore</artifactId>
@@ -31,7 +31,7 @@
<dependency> <dependency>
<groupId>com.lishid</groupId> <groupId>com.lishid</groupId>
<artifactId>openinvcommon</artifactId> <artifactId>openinvcommon</artifactId>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2011-2018 lishid. All rights reserved. * Copyright (C) 2011-2019 lishid. All rights reserved.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,5 +1,5 @@
<!-- <!--
~ Copyright (C) 2011-2018 lishid. All rights reserved. ~ Copyright (C) 2011-2019 lishid. All rights reserved.
~ ~
~ This program is free software: you can redistribute it and/or modify ~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by ~ it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
<artifactId>openinvparent</artifactId> <artifactId>openinvparent</artifactId>
<name>OpenInvParent</name> <name>OpenInvParent</name>
<url>http://dev.bukkit.org/bukkit-plugins/openinv/</url> <url>http://dev.bukkit.org/bukkit-plugins/openinv/</url>
<version>4.0.8-SNAPSHOT</version> <version>4.0.8</version>
<packaging>pom</packaging> <packaging>pom</packaging>