Compare commits
9 Commits
feature/cu
...
4.0.8
Author | SHA1 | Date | |
---|---|---|---|
|
65c6eb2693 | ||
|
ab1f4ace8a | ||
|
e7dc52bee4 | ||
|
a9c5799677 | ||
|
6d6257720a | ||
|
3e235fa688 | ||
|
dd02355ac2 | ||
|
4d3f5d67a8 | ||
|
7ad5faa2ce |
12
README.MD
12
README.MD
@@ -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
|
||||||
|
@@ -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>
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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>
|
||||||
|
@@ -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
|
||||||
|
@@ -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>
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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>
|
||||||
|
|
||||||
|
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -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());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -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>
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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>
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -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) {
|
@@ -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);
|
@@ -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>
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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>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>
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
4
pom.xml
4
pom.xml
@@ -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>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user