Updated support for EpicFarming.

This commit is contained in:
Brianna 2019-10-03 09:58:58 -04:00
parent 5d960bef8a
commit 36bdd3b519
3 changed files with 39 additions and 43 deletions

View File

@ -112,8 +112,8 @@
</dependency>
<dependency>
<groupId>com.songoda</groupId>
<artifactId>epicfarming</artifactId>
<version>2.2.1</version>
<artifactId>EpicFarming</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>

View File

@ -77,7 +77,7 @@ public class ModuleBlockBreak extends Module {
Block above = hopper.getLocation().getBlock().getRelative(0, 1, 0);
// Don't break farm items from EpicFarming
if (plugin.isEpicFarming() && com.songoda.epicfarming.EpicFarmingPlugin.getInstance().getFarmManager().getFarm(above) != null)
if (plugin.isEpicFarming() && com.songoda.epicfarming.EpicFarming.getInstance().getFarmManager().getFarm(above) != null)
return;
// don't break blacklisted blocks, fluids, or containers

View File

@ -25,11 +25,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@ -52,7 +48,7 @@ public class HopTask extends BukkitRunnable {
plugin = plug;
this.hopTicks = Math.max(1, Setting.HOP_TICKS.getInt() / 2); // Purposeful integer division. Don't go below 1.
this.runTaskTimer(plugin, 0, 2);
if((this.hasFabledSkyBlock = (fabledSkyblockPlugin = Bukkit.getPluginManager().getPlugin("FabledSkyBlock")) != null)) {
if ((this.hasFabledSkyBlock = (fabledSkyblockPlugin = Bukkit.getPluginManager().getPlugin("FabledSkyBlock")) != null)) {
try {
Class.forName("me.goodandevil.skyblock.SkyBlock");
legacyFabledSkyblock = true;
@ -134,11 +130,11 @@ public class HopTask extends BukkitRunnable {
// Can we check this item?
if ( // Ignore this one if the slot is empty
item == null
// Don't try to move items that we've added this round
|| (hopperCache.cacheChanged[i] && item.getAmount() - hopperCache.cacheAdded[i] < maxToMove)
// skip if blocked or voidlisted
|| blockedMaterials.contains(item.getType())
|| hopper.getFilter().getVoidList().stream().anyMatch(itemStack -> Methods.isSimilarMaterial(itemStack, item)))
// Don't try to move items that we've added this round
|| (hopperCache.cacheChanged[i] && item.getAmount() - hopperCache.cacheAdded[i] < maxToMove)
// skip if blocked or voidlisted
|| blockedMaterials.contains(item.getType())
|| hopper.getFilter().getVoidList().stream().anyMatch(itemStack -> Methods.isSimilarMaterial(itemStack, item)))
continue;
doProcess = true;
@ -269,9 +265,9 @@ public class HopTask extends BukkitRunnable {
contents = aboveCache.cachedInventory;
aboveInvHolder = null;
} else if (isFarmItem) {
aboveInvHolder = this.getEpicFarmingItemWrapped(above);
pullableSlots = IntStream.rangeClosed(27, 53).toArray();
contents = aboveInvHolder.getInventory().getContents();
aboveInvHolder = null;
contents = getFarmContents(above);
pullableSlots = IntStream.rangeClosed(0, contents.length - 1).toArray();
} else {
if ((aboveInvHolder = this.getRandomInventoryHolderFromEntities(nearbyEntities)) == null)
return;
@ -303,12 +299,12 @@ public class HopTask extends BukkitRunnable {
// respect whitelist/blacklist filters
if (toHopper.getFilter().getEndPoint() == null
&& !(toHopper.getFilter().getWhiteList().isEmpty() && toHopper.getFilter().getBlackList().isEmpty())) {
&& !(toHopper.getFilter().getWhiteList().isEmpty() && toHopper.getFilter().getBlackList().isEmpty())) {
// this hopper has a filter with no rejection endpoint, so don't absorb disalowed items
// whitelist has priority
if (!toHopper.getFilter().getWhiteList().isEmpty()) {
// is this item on the whitelist?
if (!toHopper.getFilter().getWhiteList().stream().anyMatch(item -> Methods.isSimilarMaterial(toMove, item))) {
if (toHopper.getFilter().getWhiteList().stream().noneMatch(item -> Methods.isSimilarMaterial(toMove, item))) {
// nope!
continue;
}
@ -322,7 +318,7 @@ public class HopTask extends BukkitRunnable {
}
// Get amount to move.
int amountToMove = toMove.getAmount() < maxToMove ? toMove.getAmount() : maxToMove;
int amountToMove = Math.min(toMove.getAmount(), maxToMove);
// Create item that will be moved.
ItemStack itemToMove = toMove.clone();
@ -335,7 +331,10 @@ public class HopTask extends BukkitRunnable {
if (aboveCache != null) {
aboveCache.removeItems(itemToMove);
} else {
this.debt(itemToMove, amountToMove, aboveInvHolder);
if (isFarmItem)
com.songoda.epicfarming.EpicFarming.getInstance().getFarmManager().getFarm(above).removeMaterial(itemToMove.getType(), amountToMove);
else
this.debt(itemToMove, amountToMove, aboveInvHolder);
}
break;
}
@ -388,7 +387,7 @@ public class HopTask extends BukkitRunnable {
StorageContainerCache.Cache cache = new StorageContainerCache.Cache(targetBlock.getType(), destinationInventory.getContents());
if (tryPush(hopper, hopperCache, cache, filterCache, maxToMove, blockedMaterials)) {
// update inventory and exit
if(cache.isDirty())
if (cache.isDirty())
destinationInventory.setContents(cache.cachedInventory);
return;
}
@ -413,8 +412,8 @@ public class HopTask extends BukkitRunnable {
// if we've gotten this far, check if we can push into a minecart
if (checkForMinecarts) {
for (InventoryHolder minecartInventory : hopper.getWorld().getNearbyEntities(pointingLocation.clone().add(0.5, 0.5, 0.5), 0.5, 0.5, 0.5)
.stream().filter(e -> e.getType() == EntityType.MINECART_CHEST || e.getType() == EntityType.MINECART_HOPPER)
.map(e -> (InventoryHolder) e).collect(Collectors.toSet())) {
.stream().filter(e -> e.getType() == EntityType.MINECART_CHEST || e.getType() == EntityType.MINECART_HOPPER)
.map(e -> (InventoryHolder) e).collect(Collectors.toSet())) {
StorageContainerCache.Cache cache = new StorageContainerCache.Cache(Material.CHEST, minecartInventory.getInventory().getContents());
if (tryPush(hopper, hopperCache, cache, filterCache, maxToMove, blockedMaterials)) {
if (cache.isDirty())
@ -426,10 +425,10 @@ public class HopTask extends BukkitRunnable {
}
private boolean tryPush(com.songoda.epichoppers.hopper.Hopper hopper,
StorageContainerCache.Cache hopperCache,
StorageContainerCache.Cache targetCache,
StorageContainerCache.Cache filterCache,
int maxToMove, Collection<Material> blockedMaterials) {
StorageContainerCache.Cache hopperCache,
StorageContainerCache.Cache targetCache,
StorageContainerCache.Cache filterCache,
int maxToMove, Collection<Material> blockedMaterials) {
// Loop through all of our hopper's item slots.
for (int i = 0; i < 5; i++) {
@ -439,11 +438,11 @@ public class HopTask extends BukkitRunnable {
// Can we check this item?
if ( // Ignore this one if the slot is empty
item == null
// Don't try to move items that we've added this round
|| (hopperCache.cacheChanged[i] && item.getAmount() - hopperCache.cacheAdded[i] < maxToMove)
// skip if blocked or voidlisted
|| blockedMaterials.contains(item.getType())
|| hopper.getFilter().getVoidList().stream().anyMatch(itemStack -> Methods.isSimilarMaterial(itemStack, item)))
// Don't try to move items that we've added this round
|| (hopperCache.cacheChanged[i] && item.getAmount() - hopperCache.cacheAdded[i] < maxToMove)
// skip if blocked or voidlisted
|| blockedMaterials.contains(item.getType())
|| hopper.getFilter().getVoidList().stream().anyMatch(itemStack -> Methods.isSimilarMaterial(itemStack, item)))
continue;
// Create item that will be moved.
@ -495,6 +494,7 @@ public class HopTask extends BukkitRunnable {
/**
* Gets a set of slots that can be pulled from based on the given material
*
* @param material The material to get pullable slots for
* @return A set of valid pullable slots
*/
@ -527,6 +527,7 @@ public class HopTask extends BukkitRunnable {
/**
* Gets a random InventoryHolder from a collection of entities
* Only grabs InventoryHolders from StorageMinecarts and HopperMinecarts
*
* @param entities The collection of entities
* @return A random InventoryHolder if one exists, otherwise null
*/
@ -543,22 +544,17 @@ public class HopTask extends BukkitRunnable {
/**
* Checks if a given block is an EpicFarming farm item
*
* @param block The block to check
* @return true if the block is a farm item, otherwise false
*/
private boolean isFarmItem(Block block) {
return EpicHoppers.getInstance().isEpicFarming() && com.songoda.epicfarming.EpicFarmingPlugin.getInstance().getFarmManager().getFarm(block) != null;
return EpicHoppers.getInstance().isEpicFarming() && com.songoda.epicfarming.EpicFarming.getInstance().getFarmManager().getFarm(block) != null;
}
/**
* Gets an EpicFarming block as an InventoryHolder
* Needed because EpicFarming doesn't natively support having an InventoryHolder for the farm item
*
* @param block The block to effectively attach an InventoryHolder to
* @return An InventoryHolder wrapping the EpicFarming inventory
*/
private InventoryHolder getEpicFarmingItemWrapped(Block block) {
return () -> com.songoda.epicfarming.EpicFarmingPlugin.getInstance().getFarmManager().getFarm(block).getInventory();
private ItemStack[] getFarmContents(Block block) {
return com.songoda.epicfarming.EpicFarming.getInstance().getFarmManager()
.getFarm(block).getItems().toArray(new ItemStack[0]);
}
}