Ability to disable/enable AutoCrafters, ChestLinks and HopperFilters (#82)

This commit is contained in:
ceze88 2022-06-13 16:48:30 +02:00 committed by GitHub
parent f88baf2c1c
commit f0c902513e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 255 additions and 1106 deletions

View File

@ -29,10 +29,12 @@ public class PluginConfig {
* ***************/
public final static Value<Boolean> IS_UPDATE_CHECKER_ENABLED = new Value<>("update-checker", Boolean.class, true);
public final static Value<Integer> UPDATE_CHECKER_PERIOD = new Value<>("update-checker-period", Integer.class, 60 * 60);
public final static Value<Boolean> CHESTLINKS_ENABLED = new Value<>("chestlinks-enabled", Boolean.class, true);
public final static Value<Boolean> AUTOCRAFTERS_ENABLED = new Value<>("autocrafters-enabled", Boolean.class, true);
public final static Value<Boolean> HOPPER_FILTERS_ENABLED = new Value<>("hopper-filters-enabled", Boolean.class, true);
public final static Value<Boolean> SHOULD_LIMIT_CHESTS = new Value<>("limit-chests", Boolean.class, false);
public final static Value<Integer> LIMIT_CHESTS_AMOUNT = new Value<>("limit-chestlinks-amount", Integer.class, 0);
public final static Value<Boolean> SHOULD_ANIMATE_ALL_CHESTS = new Value<>("should-animate-all-chests", Boolean.class, true);
public final static Value<Boolean> SHOULD_RUN_HOPPERS_UNLOADED_CHUNKS = new Value<>("run-hoppers-unloaded-chunks", Boolean.class, false);
public final static Value<Boolean> DISPLAY_CHESTLINK_ARMOUR_STAND = new Value<>("display_chestlink_armour_stand", Boolean.class, true);
public final static Value<Boolean> DISPLAY_AUTOCRAFT_ARMOUR_STAND = new Value<>("display_autocraft_armour_stands", Boolean.class, true);
public final static Value<Boolean> INVISIBLE_FILTER_ITEM_FRAMES = new Value<>("set-filter-itemframe-invisible", Boolean.class, false);

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ChestsPlusPlus-Parent</artifactId>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>ChestsPlusPlus_1_16</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus-API</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,89 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1;
import com.jamesdpeters.minecraft.chests.Api;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.TileEntityOpener;
import com.jamesdpeters.minecraft.chests.v1_16_R1.tileentities.CustomTileEntityBarrel;
import com.jamesdpeters.minecraft.chests.v1_16_R1.tileentities.CustomTileEntityChest;
import net.minecraft.server.v1_16_R1.BlockPosition;
import net.minecraft.server.v1_16_R1.TileEntity;
import net.minecraft.server.v1_16_R1.TileEntityBarrel;
import net.minecraft.server.v1_16_R1.TileEntityChest;
import net.minecraft.server.v1_16_R1.TileEntityChestTrapped;
import net.minecraft.server.v1_16_R1.TileEntityTypes;
import net.minecraft.server.v1_16_R1.World;
import org.bukkit.Bukkit;
import org.bukkit.block.Container;
import org.bukkit.block.Lidded;
import org.bukkit.craftbukkit.v1_16_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_16_R1.block.CraftContainer;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory;
import java.util.List;
public class ChestOpener_1_16 implements ChestOpener {
@Override
public TileEntityOpener updateState(Inventory inventory, Container container, TileEntityOpener tileEntityOpener) {
if(hasLiddedAPI()){
if(container instanceof Lidded){
if(inventory.getViewers().size() > 0){
((Lidded) container).open();
} else {
((Lidded) container).close();
}
return null;
}
return null;
}
if(tileEntityOpener != null) {
TileEntityOpener opener = tileEntityOpener;
Bukkit.getScheduler().scheduleSyncDelayedTask(Api.getPlugin(), ()-> opener.setViewers(inventory.getViewers()),1);
return tileEntityOpener;
} else {
CraftContainer craftContainer = (CraftContainer) container;
CraftWorld craftWorld = (CraftWorld) craftContainer.getWorld();
World world = craftWorld.getHandle();
BlockPosition position = craftContainer.getPosition();
TileEntity tileEntity = world.getTileEntity(position);
//Checks if Tile Entity has already got custom Opener.
if (tileEntity instanceof TileEntityOpener) {
tileEntityOpener = (TileEntityOpener) tileEntity;
TileEntityOpener opener = tileEntityOpener;
Bukkit.getScheduler().scheduleSyncDelayedTask(Api.getPlugin(), ()-> opener.setViewers(inventory.getViewers()),1);
return tileEntityOpener;
} else {
//If not set the new tile entity and set the viewers.
if (tileEntity instanceof TileEntityChest) {
CustomTileEntityChest tileEntityChest = new CustomTileEntityChest(tileEntity instanceof TileEntityChestTrapped ? TileEntityTypes.TRAPPED_CHEST : TileEntityTypes.CHEST);
setTileEnt(world, position, tileEntityChest, inventory.getViewers());
return tileEntityChest;
} else if (tileEntity instanceof TileEntityBarrel) {
CustomTileEntityBarrel barrel = new CustomTileEntityBarrel();
setTileEnt(world, position, barrel, inventory.getViewers());
return barrel;
}
}
return null;
}
}
private <T extends TileEntity & TileEntityOpener> void setTileEnt(World world, BlockPosition position, T tileEntOpener, List<HumanEntity> viewers){
world.removeTileEntity(position);
world.setTileEntity(position, tileEntOpener);
Bukkit.getScheduler().scheduleSyncDelayedTask(Api.getPlugin(), ()-> tileEntOpener.setViewers(viewers),1);
}
private boolean hasLiddedAPI(){
try {
Class.forName("org.bukkit.block.Lidded");
return true;
} catch (ClassNotFoundException e){
return false;
}
}
}

View File

@ -1,123 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.CraftingResult;
import net.minecraft.server.v1_16_R1.Container;
import net.minecraft.server.v1_16_R1.EntityHuman;
import net.minecraft.server.v1_16_R1.IRecipe;
import net.minecraft.server.v1_16_R1.InventoryCrafting;
import net.minecraft.server.v1_16_R1.NonNullList;
import net.minecraft.server.v1_16_R1.RecipeCrafting;
import net.minecraft.server.v1_16_R1.Recipes;
import net.minecraft.server.v1_16_R1.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
import org.bukkit.craftbukkit.v1_16_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import java.util.ArrayList;
import java.util.Optional;
public class Crafting implements CraftingProvider {
@Override
public CraftingResult craft(World world, ItemStack[] items) {
CraftWorld craftWorld = (CraftWorld) world;
// Setup crafting inventories.
InventoryCrafting inventoryCrafting = new InventoryCrafting(new Container(null, -1) {
@Override
public InventoryView getBukkitView() {
return null;
}
@Override
public boolean canUse(EntityHuman entityHuman) {
return false;
}
}, 3, 3);
for (int i = 0; i < items.length; i++) {
inventoryCrafting.setItem(i, CraftItemStack.asNMSCopy(items[i]));
}
Optional<RecipeCrafting> recipe = ((CraftServer) Bukkit.getServer()).getServer().getCraftingManager().craft(Recipes.CRAFTING, inventoryCrafting, craftWorld.getHandle());
// Generate the resulting ItemStack from the Crafting Matrix
net.minecraft.server.v1_16_R1.ItemStack itemStack = net.minecraft.server.v1_16_R1.ItemStack.b;
if (recipe.isPresent()) {
itemStack = recipe.get().a(inventoryCrafting);
}
return createItemCraftResult(CraftItemStack.asBukkitCopy(itemStack), inventoryCrafting, craftWorld.getHandle());
}
@Override
public Recipe getRecipe(Player player, World world, ItemStack[] items) {
Container container = new Container(null, -1) {
@Override
public InventoryView getBukkitView() {
return null;
}
@Override
public boolean canUse(EntityHuman entityHuman) {
return false;
}
};
InventoryCrafting crafting = new InventoryCrafting(container, 3, 3);
for (int i = 0; i < items.length; i++) {
if(i >= 9) break; // ItemList cant contain more than 9 items.
crafting.setItem(i, CraftItemStack.asNMSCopy(items[i]));
}
CraftServer server = (CraftServer) Bukkit.getServer();
CraftWorld craftWorld = (CraftWorld) world;
Optional<RecipeCrafting> optional = server.getServer().getCraftingManager().craft(Recipes.CRAFTING, crafting, craftWorld.getHandle());
return optional.map(IRecipe::toBukkitRecipe).orElse(null);
}
private CraftingResult createItemCraftResult(ItemStack itemStack, InventoryCrafting inventoryCrafting, WorldServer worldServer) {
CraftServer server = (CraftServer) Bukkit.getServer();
NonNullList<net.minecraft.server.v1_16_R1.ItemStack> remainingItems = server.getServer().getCraftingManager().c(Recipes.CRAFTING, inventoryCrafting, worldServer);
CraftingResult craftItemResult = new CraftingResult(itemStack, new ItemStack[9], new ArrayList<>());
// Create resulting matrix and overflow items
for (int i = 0; i < remainingItems.size(); ++i) {
net.minecraft.server.v1_16_R1.ItemStack itemstack1 = inventoryCrafting.getItem(i);
net.minecraft.server.v1_16_R1.ItemStack itemstack2 = remainingItems.get(i);
if (!itemstack1.isEmpty()) {
inventoryCrafting.splitStack(i, 1);
itemstack1 = inventoryCrafting.getItem(i);
}
if (!itemstack2.isEmpty()) {
if (itemstack1.isEmpty()) {
inventoryCrafting.setItem(i, itemstack2);
} else if (net.minecraft.server.v1_16_R1.ItemStack.equals(itemstack1, itemstack2) && net.minecraft.server.v1_16_R1.ItemStack.matches(itemstack1, itemstack2)) {
itemstack2.add(itemstack1.getCount());
inventoryCrafting.setItem(i, itemstack2);
} else {
craftItemResult.overflowItems().add(CraftItemStack.asBukkitCopy(itemstack2));
}
}
}
for (int i = 0; i < inventoryCrafting.getContents().size(); i++) {
craftItemResult.setResultMatrix(i, CraftItemStack.asBukkitCopy(inventoryCrafting.getItem(i)));
}
return craftItemResult;
}
}

View File

@ -1,14 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1;
import com.jamesdpeters.minecraft.chests.EntityEventListener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.world.ChunkLoadEvent;
public class EntityEventListener_1_16 extends EntityEventListener {
@EventHandler
public void onChunkLoad(ChunkLoadEvent event) {
fixEntities(event.getChunk());
}
}

View File

@ -1,58 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1;
import com.jamesdpeters.minecraft.chests.BaseMaterialChecker;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.EntityEventListener;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import org.bukkit.block.Lidded;
import org.bukkit.entity.ItemFrame;
public class NMSProviderImpl implements NMSProvider {
@Override
public ChestOpener getChestOpener() {
return (inventory, container, tileEntityOpener) -> {
if(hasLiddedAPI()){
if(container instanceof Lidded){
if(inventory.getViewers().size() > 0){
((Lidded) container).open();
} else {
((Lidded) container).close();
}
}
}
return null;
};
}
@Override
public MaterialChecker getMaterialChecker() {
return new BaseMaterialChecker();
}
@Override
public CraftingProvider getCraftingProvider() {
return new Crafting();
}
@Override
public EntityEventListener getEntityEventListener() {
return new EntityEventListener_1_16();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
itemFrame.setVisible(visible);
}
private boolean hasLiddedAPI(){
try {
Class.forName("org.bukkit.block.Lidded");
return true;
} catch (ClassNotFoundException e){
return false;
}
}
}

View File

@ -1,75 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1.tileentities;
import com.jamesdpeters.minecraft.chests.TileEntityOpener;
import net.minecraft.server.v1_16_R1.BaseBlockPosition;
import net.minecraft.server.v1_16_R1.BlockBarrel;
import net.minecraft.server.v1_16_R1.EntityHuman;
import net.minecraft.server.v1_16_R1.EnumDirection;
import net.minecraft.server.v1_16_R1.IBlockData;
import net.minecraft.server.v1_16_R1.SoundCategory;
import net.minecraft.server.v1_16_R1.SoundEffect;
import net.minecraft.server.v1_16_R1.SoundEffects;
import net.minecraft.server.v1_16_R1.TileEntityBarrel;
import org.bukkit.entity.HumanEntity;
import java.util.List;
public class CustomTileEntityBarrel extends TileEntityBarrel implements TileEntityOpener {
private int phantomViewers = 0;
private List<HumanEntity> viewers;
@Override
public List<HumanEntity> getViewers() {
return viewers;
}
@Override
public void h() {
//super.h();
}
@Override
public void startOpen(EntityHuman entityhuman) {
//Do nothing
}
@Override
public void closeContainer(EntityHuman entityhuman) {
//do nothing.
}
@Override
public void setViewers(List<HumanEntity> viewers){
int previousViewers = phantomViewers;
phantomViewers = viewers.size();
this.viewers = viewers;
if(phantomViewers > 1 && previousViewers == 0) open();
if(phantomViewers == 0) close();
}
public void open(){
IBlockData iblockdata = this.getBlock();
a(iblockdata, SoundEffects.BLOCK_BARREL_OPEN);
a(iblockdata, true);
}
public void close(){
IBlockData iblockdata = this.getBlock();
a(iblockdata, SoundEffects.BLOCK_BARREL_CLOSE);
a(iblockdata, false);
}
public void a(IBlockData iblockdata, boolean flag) {
this.world.setTypeAndData(this.getPosition(), (IBlockData)iblockdata.set(BlockBarrel.b, flag), 3);
}
public void a(IBlockData iblockdata, SoundEffect soundeffect) {
BaseBlockPosition baseblockposition = ((EnumDirection)iblockdata.get(BlockBarrel.a)).p();
double d0 = (double)this.position.getX() + 0.5D + (double)baseblockposition.getX() / 2.0D;
double d1 = (double)this.position.getY() + 0.5D + (double)baseblockposition.getY() / 2.0D;
double d2 = (double)this.position.getZ() + 0.5D + (double)baseblockposition.getZ() / 2.0D;
this.world.playSound((EntityHuman)null, d0, d1, d2, soundeffect, SoundCategory.BLOCKS, 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F);
}
}

View File

@ -1,84 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R1.tileentities;
import com.jamesdpeters.minecraft.chests.TileEntityOpener;
import net.minecraft.server.v1_16_R1.Block;
import net.minecraft.server.v1_16_R1.BlockChest;
import net.minecraft.server.v1_16_R1.BlockPropertyChestType;
import net.minecraft.server.v1_16_R1.EntityHuman;
import net.minecraft.server.v1_16_R1.EnumDirection;
import net.minecraft.server.v1_16_R1.SoundCategory;
import net.minecraft.server.v1_16_R1.SoundEffect;
import net.minecraft.server.v1_16_R1.SoundEffects;
import net.minecraft.server.v1_16_R1.TileEntityChest;
import net.minecraft.server.v1_16_R1.TileEntityTypes;
import org.bukkit.entity.HumanEntity;
import java.util.List;
public class CustomTileEntityChest extends TileEntityChest implements TileEntityOpener {
private int phantomViewers = 0;
private List<HumanEntity> viewers;
public CustomTileEntityChest(TileEntityTypes<?> tileEntityTypes){
super(tileEntityTypes);
}
@Override
public List<HumanEntity> getViewers() {
return viewers;
}
@Override
public void tick() {
//Do nothing.
}
@Override
protected void onOpen() {
Block block = this.getBlock().getBlock();
if (block instanceof BlockChest) {
this.world.playBlockAction(this.position, block, 1, viewers.size());
this.world.applyPhysics(this.position, block);
}
}
@Override
public void setViewers(List<HumanEntity> viewers){
int previousViewers = phantomViewers;
phantomViewers = viewers.size();
this.viewers = viewers;
if(phantomViewers > 1 && previousViewers == 0) this.a(SoundEffects.BLOCK_CHEST_OPEN);
if(phantomViewers == 0 && previousViewers != 0) this.a(SoundEffects.BLOCK_CHEST_CLOSE);
if(phantomViewers == 0 && previousViewers == 0) return;
onOpen();
}
public void a(SoundEffect soundeffect) {
BlockPropertyChestType blockpropertychesttype = (BlockPropertyChestType)this.getBlock().get(BlockChest.c);
if (blockpropertychesttype != BlockPropertyChestType.LEFT) {
double d0 = (double)this.position.getX() + 0.5D;
double d1 = (double)this.position.getY() + 0.5D;
double d2 = (double)this.position.getZ() + 0.5D;
if (blockpropertychesttype == BlockPropertyChestType.RIGHT) {
EnumDirection enumdirection = BlockChest.h(this.getBlock());
d0 += (double)enumdirection.getAdjacentX() * 0.5D;
d2 += (double)enumdirection.getAdjacentZ() * 0.5D;
}
this.world.playSound((EntityHuman)null, d0, d1, d2, soundeffect, SoundCategory.BLOCKS, 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F);
}
}
public void startOpen(EntityHuman entityhuman) {
}
public void closeContainer(EntityHuman entityhuman) {
}
}

View File

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ChestsPlusPlus-Parent</artifactId>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>ChestsPlusPlus_1_16_R2</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus-API</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.3-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus_1_16</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.16.3-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,123 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R2;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.CraftingResult;
import net.minecraft.server.v1_16_R2.Container;
import net.minecraft.server.v1_16_R2.EntityHuman;
import net.minecraft.server.v1_16_R2.IRecipe;
import net.minecraft.server.v1_16_R2.InventoryCrafting;
import net.minecraft.server.v1_16_R2.NonNullList;
import net.minecraft.server.v1_16_R2.RecipeCrafting;
import net.minecraft.server.v1_16_R2.Recipes;
import net.minecraft.server.v1_16_R2.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
import org.bukkit.craftbukkit.v1_16_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import java.util.ArrayList;
import java.util.Optional;
public class Crafting implements CraftingProvider {
@Override
public CraftingResult craft(World world, ItemStack[] items) {
CraftWorld craftWorld = (CraftWorld) world;
// Setup crafting inventories.
InventoryCrafting inventoryCrafting = new InventoryCrafting(new Container(null, -1) {
@Override
public InventoryView getBukkitView() {
return null;
}
@Override
public boolean canUse(EntityHuman entityHuman) {
return false;
}
}, 3, 3);
for (int i = 0; i < items.length; i++) {
inventoryCrafting.setItem(i, CraftItemStack.asNMSCopy(items[i]));
}
Optional<RecipeCrafting> recipe = ((CraftServer) Bukkit.getServer()).getServer().getCraftingManager().craft(Recipes.CRAFTING, inventoryCrafting, craftWorld.getHandle());
// Generate the resulting ItemStack from the Crafting Matrix
net.minecraft.server.v1_16_R2.ItemStack itemStack = net.minecraft.server.v1_16_R2.ItemStack.b;
if (recipe.isPresent()) {
itemStack = recipe.get().a(inventoryCrafting);
}
return createItemCraftResult(CraftItemStack.asBukkitCopy(itemStack), inventoryCrafting, craftWorld.getHandle());
}
@Override
public Recipe getRecipe(Player player, World world, ItemStack[] items) {
Container container = new Container(null, -1) {
@Override
public InventoryView getBukkitView() {
return null;
}
@Override
public boolean canUse(EntityHuman entityHuman) {
return false;
}
};
InventoryCrafting crafting = new InventoryCrafting(container, 3, 3);
for (int i = 0; i < items.length; i++) {
if(i >= 9) break; // ItemList cant contain more than 9 items.
crafting.setItem(i, CraftItemStack.asNMSCopy(items[i]));
}
CraftServer server = (CraftServer) Bukkit.getServer();
CraftWorld craftWorld = (CraftWorld) world;
Optional<RecipeCrafting> optional = server.getServer().getCraftingManager().craft(Recipes.CRAFTING, crafting, craftWorld.getHandle());
return optional.map(IRecipe::toBukkitRecipe).orElse(null);
}
private CraftingResult createItemCraftResult(ItemStack itemStack, InventoryCrafting inventoryCrafting, WorldServer worldServer) {
CraftServer server = (CraftServer) Bukkit.getServer();
NonNullList<net.minecraft.server.v1_16_R2.ItemStack> remainingItems = server.getServer().getCraftingManager().c(Recipes.CRAFTING, inventoryCrafting, worldServer);
CraftingResult craftItemResult = new CraftingResult(itemStack, new ItemStack[9], new ArrayList<>());
// Create resulting matrix and overflow items
for (int i = 0; i < remainingItems.size(); ++i) {
net.minecraft.server.v1_16_R2.ItemStack itemstack1 = inventoryCrafting.getItem(i);
net.minecraft.server.v1_16_R2.ItemStack itemstack2 = remainingItems.get(i);
if (!itemstack1.isEmpty()) {
inventoryCrafting.splitStack(i, 1);
itemstack1 = inventoryCrafting.getItem(i);
}
if (!itemstack2.isEmpty()) {
if (itemstack1.isEmpty()) {
inventoryCrafting.setItem(i, itemstack2);
} else if (net.minecraft.server.v1_16_R2.ItemStack.equals(itemstack1, itemstack2) && net.minecraft.server.v1_16_R2.ItemStack.matches(itemstack1, itemstack2)) {
itemstack2.add(itemstack1.getCount());
inventoryCrafting.setItem(i, itemstack2);
} else {
craftItemResult.overflowItems().add(CraftItemStack.asBukkitCopy(itemstack2));
}
}
}
for (int i = 0; i < inventoryCrafting.getContents().size(); i++) {
craftItemResult.setResultMatrix(i, CraftItemStack.asBukkitCopy(inventoryCrafting.getItem(i)));
}
return craftItemResult;
}
}

View File

@ -1,59 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R2;
import com.jamesdpeters.minecraft.chests.BaseMaterialChecker;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.EntityEventListener;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.v1_16_R1.EntityEventListener_1_16;
import org.bukkit.block.Lidded;
import org.bukkit.entity.ItemFrame;
public class NMSProviderImpl implements NMSProvider {
@Override
public ChestOpener getChestOpener() {
return (inventory, container, tileEntityOpener) -> {
if(hasLiddedAPI()){
if(container instanceof Lidded){
if(inventory.getViewers().size() > 0){
((Lidded) container).open();
} else {
((Lidded) container).close();
}
}
}
return null;
};
}
@Override
public MaterialChecker getMaterialChecker() {
return new BaseMaterialChecker();
}
@Override
public CraftingProvider getCraftingProvider() {
return new Crafting();
}
@Override
public EntityEventListener getEntityEventListener() {
return new EntityEventListener_1_16();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
itemFrame.setVisible(visible);
}
private boolean hasLiddedAPI(){
try {
Class.forName("org.bukkit.block.Lidded");
return true;
} catch (ClassNotFoundException e){
return false;
}
}
}

View File

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ChestsPlusPlus-Parent</artifactId>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>ChestsPlusPlus_1_16_R3</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus-API</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus_1_16</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,132 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R3;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.CraftingResult;
import net.minecraft.server.v1_16_R3.Container;
import net.minecraft.server.v1_16_R3.EntityHuman;
import net.minecraft.server.v1_16_R3.IRecipe;
import net.minecraft.server.v1_16_R3.InventoryCrafting;
import net.minecraft.server.v1_16_R3.NonNullList;
import net.minecraft.server.v1_16_R3.RecipeCrafting;
import net.minecraft.server.v1_16_R3.Recipes;
import net.minecraft.server.v1_16_R3.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
import org.bukkit.craftbukkit.v1_16_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import java.util.ArrayList;
import java.util.Optional;
public class Crafting implements CraftingProvider {
@Override
public CraftingResult craft(World world, ItemStack[] items) {
CraftWorld craftWorld = (CraftWorld) world;
// Setup crafting inventories.
InventoryCrafting inventoryCrafting = new InventoryCrafting(new Container(null, -1) {
@Override
public InventoryView getBukkitView() {
return null;
}
@Override
public boolean canUse(EntityHuman entityHuman) {
return false;
}
}, 3, 3);
for (int i = 0; i < items.length; i++) {
inventoryCrafting.setItem(i, CraftItemStack.asNMSCopy(items[i]));
}
Optional<RecipeCrafting> recipe = ((CraftServer) Bukkit.getServer()).getServer().getCraftingManager().craft(Recipes.CRAFTING, inventoryCrafting, craftWorld.getHandle());
// Generate the resulting ItemStack from the Crafting Matrix
net.minecraft.server.v1_16_R3.ItemStack itemStack = net.minecraft.server.v1_16_R3.ItemStack.b;
if (recipe.isPresent()) {
itemStack = recipe.get().a(inventoryCrafting);
}
return createItemCraftResult(CraftItemStack.asBukkitCopy(itemStack), inventoryCrafting, craftWorld.getHandle());
}
@Override
public Recipe getRecipe(Player player, World world, ItemStack[] items) {
Container container = new Container(null, -1) {
@Override
public InventoryView getBukkitView() {
return null;
}
@Override
public boolean canUse(EntityHuman entityHuman) {
return false;
}
};
InventoryCrafting crafting = new InventoryCrafting(container, 3, 3);
for (int i = 0; i < items.length; i++) {
if(i >= 9) break; // ItemList cant contain more than 9 items.
crafting.setItem(i, CraftItemStack.asNMSCopy(items[i]));
}
CraftServer server = (CraftServer) Bukkit.getServer();
CraftWorld craftWorld = (CraftWorld) world;
Optional<RecipeCrafting> optional = server.getServer().getCraftingManager().craft(Recipes.CRAFTING, crafting, craftWorld.getHandle());
return optional.map(IRecipe::toBukkitRecipe).orElse(null);
}
private Optional<RecipeCrafting> getNMSRecipe(ItemStack[] craftingMatrix, InventoryCrafting inventoryCrafting, CraftWorld world) {
for(int i = 0; i < craftingMatrix.length; ++i) {
inventoryCrafting.setItem(i, CraftItemStack.asNMSCopy(craftingMatrix[i]));
}
CraftServer server = (CraftServer) Bukkit.getServer();
return server.getServer().getCraftingManager().craft(Recipes.CRAFTING, inventoryCrafting, world.getHandle());
}
private CraftingResult createItemCraftResult(ItemStack itemStack, InventoryCrafting inventoryCrafting, WorldServer worldServer) {
CraftServer server = (CraftServer) Bukkit.getServer();
NonNullList<net.minecraft.server.v1_16_R3.ItemStack> remainingItems = server.getServer().getCraftingManager().c(Recipes.CRAFTING, inventoryCrafting, worldServer);
CraftingResult craftItemResult = new CraftingResult(itemStack, new ItemStack[9], new ArrayList<>());
// Create resulting matrix and overflow items
for (int i = 0; i < remainingItems.size(); ++i) {
net.minecraft.server.v1_16_R3.ItemStack itemstack1 = inventoryCrafting.getItem(i);
net.minecraft.server.v1_16_R3.ItemStack itemstack2 = remainingItems.get(i);
if (!itemstack1.isEmpty()) {
inventoryCrafting.splitStack(i, 1);
itemstack1 = inventoryCrafting.getItem(i);
}
if (!itemstack2.isEmpty()) {
if (itemstack1.isEmpty()) {
inventoryCrafting.setItem(i, itemstack2);
} else if (net.minecraft.server.v1_16_R3.ItemStack.equals(itemstack1, itemstack2) && net.minecraft.server.v1_16_R3.ItemStack.matches(itemstack1, itemstack2)) {
itemstack2.add(itemstack1.getCount());
inventoryCrafting.setItem(i, itemstack2);
} else {
craftItemResult.overflowItems().add(CraftItemStack.asBukkitCopy(itemstack2));
}
}
}
for (int i = 0; i < inventoryCrafting.getContents().size(); i++) {
craftItemResult.setResultMatrix(i, CraftItemStack.asBukkitCopy(inventoryCrafting.getItem(i)));
}
return craftItemResult;
}
}

View File

@ -1,59 +0,0 @@
package com.jamesdpeters.minecraft.chests.v1_16_R3;
import com.jamesdpeters.minecraft.chests.BaseMaterialChecker;
import com.jamesdpeters.minecraft.chests.ChestOpener;
import com.jamesdpeters.minecraft.chests.CraftingProvider;
import com.jamesdpeters.minecraft.chests.EntityEventListener;
import com.jamesdpeters.minecraft.chests.MaterialChecker;
import com.jamesdpeters.minecraft.chests.NMSProvider;
import com.jamesdpeters.minecraft.chests.v1_16_R1.EntityEventListener_1_16;
import org.bukkit.block.Lidded;
import org.bukkit.entity.ItemFrame;
public class NMSProviderImpl implements NMSProvider {
@Override
public ChestOpener getChestOpener() {
return (inventory, container, tileEntityOpener) -> {
if(hasLiddedAPI()){
if(container instanceof Lidded){
if(inventory.getViewers().size() > 0){
((Lidded) container).open();
} else {
((Lidded) container).close();
}
}
}
return null;
};
}
@Override
public MaterialChecker getMaterialChecker() {
return new BaseMaterialChecker();
}
@Override
public CraftingProvider getCraftingProvider() {
return new Crafting();
}
@Override
public EntityEventListener getEntityEventListener() {
return new EntityEventListener_1_16();
}
@Override
public void setItemFrameVisible(ItemFrame itemFrame, boolean visible) {
itemFrame.setVisible(visible);
}
private boolean hasLiddedAPI(){
try {
Class.forName("org.bukkit.block.Lidded");
return true;
} catch (ClassNotFoundException e){
return false;
}
}
}

View File

@ -39,12 +39,6 @@
<version>${minecraft.version}-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus_1_16</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>

View File

@ -6,7 +6,7 @@
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus-Master</artifactId>
<version>2.6.2-Release</version>
<version>2.6.3-Beta</version>
<properties>
<maven.compiler.target>16</maven.compiler.target>
@ -63,7 +63,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.14.4-R0.1-SNAPSHOT</version>
<version>1.17.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
@ -122,30 +122,6 @@
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus_1_16_R3</artifactId>
<version>1.0-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus_1_16_R2</artifactId>
<version>1.0-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus_1_16</artifactId>
<version>1.0-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.jamesdpeters.minecraft.chests</groupId>
<artifactId>ChestsPlusPlus-API</artifactId>

View File

@ -6,8 +6,10 @@ import com.jamesdpeters.minecraft.chests.commands.ChestLinkCommand;
import com.jamesdpeters.minecraft.chests.commands.ChestsPlusPlusCommand;
import com.jamesdpeters.minecraft.chests.crafting.Crafting;
import com.jamesdpeters.minecraft.chests.lang.LangFileProperties;
import com.jamesdpeters.minecraft.chests.listeners.HopperListener;
import com.jamesdpeters.minecraft.chests.listeners.AutoCrafterListener;
import com.jamesdpeters.minecraft.chests.listeners.HopperFilterListener;
import com.jamesdpeters.minecraft.chests.listeners.InventoryListener;
import com.jamesdpeters.minecraft.chests.listeners.LinkedChestHopperListener;
import com.jamesdpeters.minecraft.chests.listeners.StorageListener;
import com.jamesdpeters.minecraft.chests.listeners.WorldListener;
import com.jamesdpeters.minecraft.chests.maventemplates.BuildConstants;
@ -24,13 +26,16 @@ import com.jamesdpeters.minecraft.chests.serialize.MaterialSerializer;
import com.jamesdpeters.minecraft.chests.serialize.RecipeSerializable;
import com.jamesdpeters.minecraft.chests.serialize.SpigotConfig;
import com.jamesdpeters.minecraft.chests.storage.autocraft.AutoCraftingStorage;
import com.jamesdpeters.minecraft.chests.storage.autocraft.AutoCraftingStorageType;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorage;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorageType;
import com.jamesdpeters.minecraft.chests.versionchecker.UpdateChecker;
import fr.minuskube.inv.InventoryManager;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.event.HandlerList;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.java.annotation.command.Command;
@ -42,7 +47,7 @@ import org.bukkit.plugin.java.annotation.plugin.Plugin;
import org.bukkit.plugin.java.annotation.plugin.author.Author;
@Plugin(name = "ChestsPlusPlus", version = BuildConstants.VERSION)
@ApiVersion(ApiVersion.Target.v1_14)
@ApiVersion(ApiVersion.Target.v1_17)
@Description(value = "Minecraft Spigot mod that enhances chests and hoppers, with ChestLinks and Hopper filters!")
@Author(value = "jameslfc19")
@Commands({
@ -96,10 +101,7 @@ public class ChestsPlusPlus extends JavaPlugin {
//API initialisation
ApiSpecific.init(this);
//Register commands
new ChestLinkCommand().register(this);
new AutoCraftCommand().register(this);
new ChestsPlusPlusCommand().register(this);
//Load storage
ServerType.init();
@ -125,23 +127,50 @@ public class ChestsPlusPlus extends JavaPlugin {
}), 0, PluginConfig.UPDATE_CHECKER_PERIOD.get() * 20);
}
getServer().getPluginManager().registerEvents(ApiSpecific.getNmsProvider().getEntityEventListener(), this);
Bukkit.getWorlds().forEach(world -> {
ApiSpecific.getNmsProvider().getEntityEventListener().fixEntities(world);
});
//Load storages after load.
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
Crafting.load();
new Config();
getLogger().info("Chests++ Successfully Loaded Config and Recipes");
//Register event listeners
getServer().getPluginManager().registerEvents(new StorageListener(), this);
getServer().getPluginManager().registerEvents(new InventoryListener(), this);
getServer().getPluginManager().registerEvents(new HopperListener(), this);
//LinkedChest
if (PluginConfig.CHESTLINKS_ENABLED.get()) {
new ChestLinkCommand().register(this);
getServer().getPluginManager().registerEvents(new LinkedChestHopperListener(), this);
}
//AutoCrafter
if (PluginConfig.AUTOCRAFTERS_ENABLED.get()) {
new AutoCraftCommand().register(this);
getServer().getPluginManager().registerEvents(new AutoCrafterListener(), this);
}
//HopperFilter
if (PluginConfig.HOPPER_FILTERS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(new HopperFilterListener(), this);
}
//Shared
if (PluginConfig.CHESTLINKS_ENABLED.get() || PluginConfig.AUTOCRAFTERS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(new StorageListener(), this);
getServer().getPluginManager().registerEvents(new InventoryListener(), this);
}
//Other
getServer().getPluginManager().registerEvents(new WorldListener(), this);
Config.getStorageTypes().forEach(storageType -> getServer().getPluginManager().registerEvents(storageType, this));
new ChestsPlusPlusCommand().register(this);
Config.getStorageTypes().forEach(storageType -> {
if (storageType instanceof AutoCraftingStorageType && PluginConfig.AUTOCRAFTERS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(storageType, this);
}
if (storageType instanceof ChestLinkStorageType && PluginConfig.CHESTLINKS_ENABLED.get()) {
getServer().getPluginManager().registerEvents(storageType, this);
}
});
getServer().getPluginManager().registerEvents(ApiSpecific.getNmsProvider().getEntityEventListener(), this);
Bukkit.getWorlds().forEach(world -> ApiSpecific.getNmsProvider().getEntityEventListener().fixEntities(world));
getLogger().info("Chests++ enabled!");
}, 1);
}
@ -150,6 +179,7 @@ public class ChestsPlusPlus extends JavaPlugin {
public void onDisable() {
super.onDisable();
Config.save();
HandlerList.unregisterAll(this);
// //Remove entities that could have been left behind from bad save files/crashes etc.
// Utils.fixEntities();
}

View File

@ -6,16 +6,13 @@ import org.bukkit.entity.ItemFrame;
public class NMSProviderDefault implements NMSProvider {
//Latest version at time of build is 1.17
//All new versions should be able to run with the default provided after 1.17 <- Not seem to be working by: ceze88
//Latest version at time of build is 1.18.2
NMSProvider defaultProvider;
public NMSProviderDefault() {
String NAME = Bukkit.getServer().getClass().getPackage().getName();
String VERSION = NAME.substring(NAME.lastIndexOf('.') + 1);
switch (VERSION) {
case "v1_16_R2" -> defaultProvider = new com.jamesdpeters.minecraft.chests.v1_16_R2.NMSProviderImpl();
case "v1_16_R3" -> defaultProvider = new com.jamesdpeters.minecraft.chests.v1_16_R3.NMSProviderImpl();
case "v1_17_R1" -> defaultProvider = new com.jamesdpeters.minecraft.chests.v1_17_R1.NMSProviderImpl();
case "v1_18_R1" -> defaultProvider = new com.jamesdpeters.minecraft.chests.v1_18_R1.NMSProviderImpl();
case "v1_18_R2" -> defaultProvider = new com.jamesdpeters.minecraft.chests.v1_18_R2.NMSProviderImpl();
@ -23,7 +20,7 @@ public class NMSProviderDefault implements NMSProvider {
ChestsPlusPlus.PLUGIN.getLogger().severe("§c=======================================================");
ChestsPlusPlus.PLUGIN.getLogger().severe("§cThis version is not supported. Please update your server!");
ChestsPlusPlus.PLUGIN.getLogger().severe("§c=======================================================");
defaultProvider = new com.jamesdpeters.minecraft.chests.v1_16_R1.NMSProviderImpl();
defaultProvider = new com.jamesdpeters.minecraft.chests.v1_17_R1.NMSProviderImpl();
}
}
}

View File

@ -0,0 +1,39 @@
package com.jamesdpeters.minecraft.chests.filters;
import com.google.common.collect.Sets;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import org.bukkit.Keyed;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Tag;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
@SuppressWarnings("rawtypes")
public class ChestsPlusPlusTag {
public static Tag SEEDS;
static {
SEEDS = new Tag() {
@Override
public boolean isTagged(@NotNull Keyed item) {
return item.equals(Material.WHEAT_SEEDS) || item.equals(Material.PUMPKIN_SEEDS) || item.equals(Material.MELON_SEEDS) || item.equals(Material.BEETROOT_SEEDS);
}
@NotNull
@Override
public Set<Material> getValues() {
return Sets.newHashSet(Material.WHEAT_SEEDS, Material.PUMPKIN_SEEDS, Material.MELON_SEEDS, Material.BEETROOT_SEEDS);
}
@NotNull
@Override
public NamespacedKey getKey() {
return new NamespacedKey(ChestsPlusPlus.PLUGIN, "seeds");
}
};
}
}

View File

@ -7,13 +7,15 @@ import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("unchecked")
public class ItemTypeUtil {
private static List<Tag<Material>> tags;
private static final List<Tag<Material>> tags;
static {
tags = new ArrayList<>();
tags.add(ChestsPlusPlusTag.SEEDS);
tags.add(Tag.WOOL);
tags.add(Tag.PLANKS);
tags.add(Tag.STONE_BRICKS);

View File

@ -172,6 +172,11 @@ public class CraftingInventoryImpl implements CraftingInventory {
return inventory.firstEmpty();
}
@Override
public boolean isEmpty() {
return inventory.isEmpty();
}
@Override
public void remove(@NotNull Material material) throws IllegalArgumentException {
inventory.remove(material);

View File

@ -0,0 +1,89 @@
package com.jamesdpeters.minecraft.chests.listeners;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.interfaces.VirtualCraftingHolder;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
public class AutoCrafterListener implements Listener {
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
InventoryHolder holder = event.getInventory().getHolder();
if (holder instanceof VirtualCraftingHolder) {
((VirtualCraftingHolder) holder).stopAnimation();
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onInventoryPlayerUpdate(InventoryDragEvent event) {
craftingUpdate(event);
}
//CRAFTING
@EventHandler(priority = EventPriority.HIGHEST)
public void inventoryDragEvent(InventoryDragEvent event) {
Inventory inventory = event.getInventory();
if (inventory.getHolder() instanceof VirtualCraftingHolder) {
Player p = (Player) event.getWhoClicked();
for (int slot : event.getRawSlots()) {
if (slot >= p.getOpenInventory().getTopInventory().getSize())
continue;
setCraftingItem(event.getInventory(), slot, event.getOldCursor());
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onCraftingPlayerUpdate(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
if (event.getView().getTopInventory().getHolder() instanceof VirtualCraftingHolder) {
if (event.getAction() == InventoryAction.COLLECT_TO_CURSOR ||
event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY ||
event.getAction() == InventoryAction.NOTHING) {
event.setCancelled(true);
player.updateInventory();
return;
}
if (event.getClickedInventory() == player.getOpenInventory().getTopInventory()) {
if (event.getSlot() == 0) event.setCancelled(true);
if (event.getSlot() >= 1 && event.getSlot() <= 9) {
setCraftingItem(event.getInventory(), event.getSlot(), event.getCursor());
event.setCancelled(true);
craftingUpdate(event);
}
}
}
}
private void setCraftingItem(Inventory inventory, int slot, ItemStack cursor) {
ItemStack clone = null;
if (cursor != null) {
clone = cursor.clone();
clone.setAmount(1);
}
inventory.setItem(slot, clone);
}
private void craftingUpdate(InventoryInteractEvent event) {
InventoryHolder holder = event.getInventory().getHolder();
if (holder instanceof VirtualCraftingHolder) {
Bukkit.getScheduler().scheduleSyncDelayedTask(ChestsPlusPlus.PLUGIN, (((VirtualCraftingHolder) holder).setUpdatingRecipe(true))::updateCrafting, 1);
Bukkit.getScheduler().scheduleSyncDelayedTask(ChestsPlusPlus.PLUGIN, (((VirtualCraftingHolder) holder))::forceUpdateInventory, 1);
}
}
}

View File

@ -10,6 +10,7 @@ import com.jamesdpeters.minecraft.chests.serialize.Config;
import com.jamesdpeters.minecraft.chests.PluginConfig;
import com.jamesdpeters.minecraft.chests.serialize.SpigotConfig;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorage;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorageType;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
@ -29,7 +30,7 @@ import org.bukkit.scheduler.BukkitRunnable;
import java.util.function.Function;
public class HopperListener implements Listener {
public class HopperFilterListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onHopperMoveEvent(InventoryMoveItemEvent event) {
@ -77,7 +78,9 @@ public class HopperListener implements Listener {
//FROM HOPPER
if (event.getInitiator().getHolder() instanceof Hopper) {
Location location = event.getDestination().getLocation();
ChestLinkStorage storage = Config.getChestLink().getStorage(location);
ChestLinkStorageType storageType = Config.getChestLink();
if (storageType == null) return;
ChestLinkStorage storage = storageType.getStorage(location);
if (storage != null) {
if(!event.isCancelled()) {
event.setCancelled(true);

View File

@ -1,7 +1,6 @@
package com.jamesdpeters.minecraft.chests.listeners;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.interfaces.VirtualCraftingHolder;
import com.jamesdpeters.minecraft.chests.interfaces.VirtualInventoryHolder;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.sort.InventorySorter;
@ -10,14 +9,11 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
public class InventoryListener implements Listener {
@ -39,9 +35,6 @@ public class InventoryListener implements Listener {
Utils.closeStorageInventory(vHolder.getStorage());
vHolder.getStorage().onItemDisplayUpdate(InventorySorter.getMostCommonItem(event.getInventory()));
}
if (holder instanceof VirtualCraftingHolder) {
((VirtualCraftingHolder) holder).stopAnimation();
}
} catch (NullPointerException ignore) {
} //Essentials does something weird with enderchests - shit fix but works :)
}
@ -60,64 +53,5 @@ public class InventoryListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onInventoryPlayerUpdate(InventoryDragEvent event) {
inventoryUpdate(event);
craftingUpdate(event);
}
//CRAFTING
@EventHandler(priority = EventPriority.HIGHEST)
public void inventoryDragEvent(InventoryDragEvent event) {
Inventory inventory = event.getInventory();
if (inventory.getHolder() instanceof VirtualCraftingHolder) {
Player p = (Player) event.getWhoClicked();
for (int slot : event.getRawSlots()) {
if (slot >= p.getOpenInventory().getTopInventory().getSize())
continue;
setCraftingItem(event.getInventory(), slot, event.getOldCursor());
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onCraftingPlayerUpdate(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
if (event.getView().getTopInventory().getHolder() instanceof VirtualCraftingHolder) {
if (event.getAction() == InventoryAction.COLLECT_TO_CURSOR ||
event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY ||
event.getAction() == InventoryAction.NOTHING) {
event.setCancelled(true);
player.updateInventory();
return;
}
if (event.getClickedInventory() == player.getOpenInventory().getTopInventory()) {
if (event.getSlot() == 0) event.setCancelled(true);
if (event.getSlot() >= 1 && event.getSlot() <= 9) {
setCraftingItem(event.getInventory(), event.getSlot(), event.getCursor());
event.setCancelled(true);
craftingUpdate(event);
}
}
}
}
private void setCraftingItem(Inventory inventory, int slot, ItemStack cursor) {
ItemStack clone = null;
if (cursor != null) {
clone = cursor.clone();
clone.setAmount(1);
}
inventory.setItem(slot, clone);
}
private void craftingUpdate(InventoryInteractEvent event) {
InventoryHolder holder = event.getInventory().getHolder();
if (holder instanceof VirtualCraftingHolder) {
Bukkit.getScheduler().scheduleSyncDelayedTask(ChestsPlusPlus.PLUGIN, (((VirtualCraftingHolder) holder).setUpdatingRecipe(true))::updateCrafting, 1);
Bukkit.getScheduler().scheduleSyncDelayedTask(ChestsPlusPlus.PLUGIN, (((VirtualCraftingHolder) holder))::forceUpdateInventory, 1);
}
}
}

View File

@ -0,0 +1,49 @@
package com.jamesdpeters.minecraft.chests.listeners;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.serialize.Config;
import com.jamesdpeters.minecraft.chests.serialize.SpigotConfig;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorage;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorageType;
import org.bukkit.Location;
import org.bukkit.block.Hopper;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.scheduler.BukkitRunnable;
public class LinkedChestHopperListener implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void fromHopper(InventoryMoveItemEvent event) {
//FROM HOPPER
if (event.getInitiator().getHolder() instanceof Hopper) {
Location location = event.getDestination().getLocation();
if (location == null) return;
if (!Utils.isLocationChunkLoaded(location)) return;
ChestLinkStorageType storageType = Config.getChestLink();
if (storageType == null) return;
ChestLinkStorage storage = storageType.getStorage(location);
if (storage != null) {
if(!event.isCancelled()) {
event.setCancelled(true);
new BukkitRunnable() {
@Override
public void run() {
int hopperAmount = SpigotConfig.getWorldSettings(location.getWorld()).getHopperAmount();
if (Utils.hopperMove(event.getSource(), hopperAmount, storage.getInventory())) {
storage.updateDisplayItem();
}
if (event.getDestination().getHolder() != null) event.getDestination().getHolder().getInventory().clear();
if (storage.getInventory().getViewers().size() > 0) storage.sort();
}
}.runTaskLater(ChestsPlusPlus.PLUGIN, 1);
}
}
}
}
}

View File

@ -147,7 +147,11 @@ public class Utils {
}
public static List<String> getAllPlayers() {
return getPlayersAsNameList(Arrays.asList(Bukkit.getOfflinePlayers()));
List<String> result = new ArrayList<>();
for (Player p : Bukkit.getOnlinePlayers()) {
result.add(p.getName());
}
return result;
}
public static List<String> getPlayersAsNameList(Collection<? extends OfflinePlayer> players) {

View File

@ -4,7 +4,6 @@ import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.filters.HopperFilter;
import com.jamesdpeters.minecraft.chests.misc.Utils;
import com.jamesdpeters.minecraft.chests.serialize.LocationInfo;
import com.jamesdpeters.minecraft.chests.PluginConfig;
import com.jamesdpeters.minecraft.chests.serialize.SpigotConfig;
import com.jamesdpeters.minecraft.chests.storage.chestlink.ChestLinkStorage;
import org.bukkit.Location;
@ -35,7 +34,7 @@ public class VirtualChestToHopper extends BukkitRunnable {
for (LocationInfo location : storage.getLocations()) {
if (location != null) {
if (location.getLocation() != null) {
if (!PluginConfig.SHOULD_RUN_HOPPERS_UNLOADED_CHUNKS.get() && !Utils.isLocationChunkLoaded(location.getLocation()))
if (!Utils.isLocationChunkLoaded(location.getLocation()) || !location.getLocation().getChunk().isEntitiesLoaded())
continue;
Location below = location.getLocation().clone().subtract(0, 1, 0);
if (below.getBlock().getState() instanceof Hopper hopper) {

View File

@ -2,6 +2,7 @@ package com.jamesdpeters.minecraft.chests.serialize;
import com.google.common.base.Charsets;
import com.jamesdpeters.minecraft.chests.ChestsPlusPlus;
import com.jamesdpeters.minecraft.chests.PluginConfig;
import com.jamesdpeters.minecraft.chests.storage.abstracts.AbstractStorage;
import com.jamesdpeters.minecraft.chests.storage.abstracts.StorageType;
import com.jamesdpeters.minecraft.chests.storage.autocraft.AutoCraftingStorageType;
@ -53,13 +54,13 @@ public class Config {
store = new ConfigStorage();
saveASync();
}
chestLinkStorageType = new ChestLinkStorageType(store);
autoCraftingStorageType = new AutoCraftingStorageType(store);
if (PluginConfig.CHESTLINKS_ENABLED.get()) chestLinkStorageType = new ChestLinkStorageType(store);
if (PluginConfig.AUTOCRAFTERS_ENABLED.get()) autoCraftingStorageType = new AutoCraftingStorageType(store);
//Add each storage type to a list.
storageTypes = new ArrayList<>();
storageTypes.add(chestLinkStorageType);
storageTypes.add(autoCraftingStorageType);
if (PluginConfig.CHESTLINKS_ENABLED.get()) storageTypes.add(chestLinkStorageType);
if (PluginConfig.AUTOCRAFTERS_ENABLED.get()) storageTypes.add(autoCraftingStorageType);
storageTypes.forEach(StorageType::onConfigLoad);
}

View File

@ -1,4 +1,4 @@
# Chests++ Language File (Version 2.6.2-Beta)
# Chests++ Language File (Version 2.6.3-Beta)
# NOTE: This file gets replaced when the plugin launches! If you want to make modifications create a copy first!
# To create a new language file simply create a copy of this file and rename it to your desired choice for example 'en_US.properties'
# It should be located in the 'lang' folder

View File

@ -19,9 +19,6 @@
<module>ChestsPlusPlus_1_18_R2</module>
<module>ChestsPlusPlus_1_18_R1</module>
<module>ChestsPlusPlus_1_17_R1</module>
<module>ChestsPlusPlus_1_16_R3</module>
<module>ChestsPlusPlus_1_16_R2</module>
<module>ChestsPlusPlus_1_16</module>
<module>ChestsPlusPlus_Main</module>
</modules>