mirror of
https://github.com/songoda/EpicHoppers.git
synced 2025-01-26 09:31:25 +01:00
ChestMinecraft support.
This commit is contained in:
parent
e72e4939fa
commit
4bb3767b39
@ -11,12 +11,13 @@ import org.bukkit.OfflinePlayer;
|
|||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.Hopper;
|
import org.bukkit.block.Hopper;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.minecart.HopperMinecart;
|
||||||
|
import org.bukkit.entity.minecart.StorageMinecart;
|
||||||
import org.bukkit.inventory.*;
|
import org.bukkit.inventory.*;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by songoda on 3/14/2017.
|
* Created by songoda on 3/14/2017.
|
||||||
@ -72,22 +73,45 @@ public class HopHandler {
|
|||||||
|
|
||||||
ItemStack[] hopperContents = hopperState.getInventory().getContents();
|
ItemStack[] hopperContents = hopperState.getInventory().getContents();
|
||||||
|
|
||||||
if (hopper.getLinkedBlocks() == null || hopper.getLinkedBlocks().isEmpty()) continue;
|
Inventory override = null;
|
||||||
|
List<Location> linked = hopper.getLinkedBlocks();
|
||||||
|
|
||||||
for (Location destinationLocation : new ArrayList<>(hopper.getLinkedBlocks())) {
|
if (hopper.getLinkedBlocks() == null || hopper.getLinkedBlocks().isEmpty()) {
|
||||||
if (destinationLocation == null) continue;
|
HopperDirection hopperDirection = HopperDirection.getDirection(hopperState.getRawData());
|
||||||
|
Location check = hopperDirection.getLocation(location);
|
||||||
|
|
||||||
if (!destinationLocation.getWorld().isChunkLoaded(destinationLocation.getBlockX() >> 4,
|
linked.add(check);
|
||||||
destinationLocation.getBlockZ() >> 4))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Block destinationBlock = destinationLocation.getBlock();
|
Collection<Entity> nearbyEntite = hopper.getLocation().getWorld().getNearbyEntities(check, .5, .5, .5);
|
||||||
BlockState state = destinationBlock.getState();
|
|
||||||
if (!(state instanceof InventoryHolder)) {
|
for (Entity entity : nearbyEntite) {
|
||||||
hopper.clearLinkedBlocks();
|
if (entity.getType() == EntityType.MINECART_HOPPER)
|
||||||
continue;
|
override = ((HopperMinecart)entity).getInventory();
|
||||||
|
else if (entity.getType() == EntityType.MINECART_CHEST)
|
||||||
|
override = ((StorageMinecart)entity).getInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (linked.isEmpty()) continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Location destinationLocation : linked) {
|
||||||
|
Block destinationBlock = destinationLocation.getBlock();
|
||||||
|
Inventory destinationInventory = override;
|
||||||
|
if (override == null) {
|
||||||
|
if (destinationLocation == null) continue;
|
||||||
|
|
||||||
|
if (!destinationLocation.getWorld().isChunkLoaded(destinationLocation.getBlockX() >> 4,
|
||||||
|
destinationLocation.getBlockZ() >> 4))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
destinationBlock = destinationLocation.getBlock();
|
||||||
|
BlockState state = destinationBlock.getState();
|
||||||
|
if (!(state instanceof InventoryHolder)) {
|
||||||
|
hopper.clearLinkedBlocks();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
destinationInventory = ((InventoryHolder)state).getInventory();
|
||||||
}
|
}
|
||||||
InventoryHolder destinationState = (InventoryHolder) state;
|
|
||||||
|
|
||||||
BoostData boostData = instance.getBoostManager().getBoost(hopper.getPlacedBy());
|
BoostData boostData = instance.getBoostManager().getBoost(hopper.getPlacedBy());
|
||||||
|
|
||||||
@ -116,7 +140,7 @@ public class HopHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (blackList.stream().noneMatch(itemStack -> itemStack.isSimilar(hopperContents[finalIncrement]))) {
|
if (blackList.stream().noneMatch(itemStack -> itemStack.isSimilar(hopperContents[finalIncrement]))) {
|
||||||
if (addItem(hopperState, hopper, destinationState, destinationBlock, hopperContents[i], amount, i)) {
|
if (addItem(hopperState, hopper, destinationInventory, destinationBlock, hopperContents[i], amount, i)) {
|
||||||
continue main;
|
continue main;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -146,15 +170,15 @@ public class HopHandler {
|
|||||||
hopper.getFilter().setEndPoint(null);
|
hopper.getFilter().setEndPoint(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
InventoryHolder destinationState = (InventoryHolder) state;
|
Inventory destinationInventory = ((InventoryHolder)state).getInventory();
|
||||||
|
|
||||||
addItem(hopperState, hopper, destinationState, destinationBlock, item, amt, place);
|
addItem(hopperState, hopper, destinationInventory, destinationBlock, item, amt, place);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Debugger.runReport(e);
|
Debugger.runReport(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean addItem(Hopper hopperState, com.songoda.epichoppers.api.hopper.Hopper hopper, InventoryHolder destinationState, Block destinationBlock, ItemStack is, int amt, int place) {
|
private boolean addItem(Hopper hopperState, com.songoda.epichoppers.api.hopper.Hopper hopper, Inventory destinationInventory, Block destinationBlock, ItemStack is, int amt, int place) {
|
||||||
try {
|
try {
|
||||||
ItemStack it = null;
|
ItemStack it = null;
|
||||||
if (is != null) {
|
if (is != null) {
|
||||||
@ -196,7 +220,7 @@ public class HopHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (destinationBlock.getType() == Material.BREWING_STAND) {
|
if (destinationBlock.getType() == Material.BREWING_STAND) {
|
||||||
BrewerInventory brewerInventory = (BrewerInventory) destinationState.getInventory();
|
BrewerInventory brewerInventory = (BrewerInventory) destinationInventory;
|
||||||
|
|
||||||
int maxSize = newItem.getMaxStackSize();
|
int maxSize = newItem.getMaxStackSize();
|
||||||
|
|
||||||
@ -235,7 +259,7 @@ public class HopHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (destinationBlock.getType() == Material.FURNACE) {
|
} else if (destinationBlock.getType() == Material.FURNACE) {
|
||||||
FurnaceInventory furnaceInventory = (FurnaceInventory) destinationState.getInventory();
|
FurnaceInventory furnaceInventory = (FurnaceInventory) destinationInventory;
|
||||||
|
|
||||||
boolean isFuel = item.getType().isFuel();
|
boolean isFuel = item.getType().isFuel();
|
||||||
ItemStack output = isFuel ? furnaceInventory.getFuel() : furnaceInventory.getSmelting();
|
ItemStack output = isFuel ? furnaceInventory.getFuel() : furnaceInventory.getSmelting();
|
||||||
@ -261,10 +285,10 @@ public class HopHandler {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!canMove(destinationState.getInventory(), newItem)) return false;
|
if (!canMove(destinationInventory, newItem)) return false;
|
||||||
ItemStack finalIt = it;
|
ItemStack finalIt = it;
|
||||||
if (ovoid.stream().noneMatch(itemStack -> itemStack.isSimilar(finalIt))) {
|
if (ovoid.stream().noneMatch(itemStack -> itemStack.isSimilar(finalIt))) {
|
||||||
destinationState.getInventory().addItem(newItem);
|
destinationInventory.addItem(newItem);
|
||||||
}
|
}
|
||||||
hopperState.getInventory().setItem(place, is);
|
hopperState.getInventory().setItem(place, is);
|
||||||
return true;
|
return true;
|
||||||
@ -287,4 +311,61 @@ public class HopHandler {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum HopperDirection {
|
||||||
|
|
||||||
|
DOWN(0, 8, 0, -1, 0),
|
||||||
|
NORTH(2, 10, 0, 0, -1),
|
||||||
|
SOUTH(3, 11, 0, 0, 1),
|
||||||
|
WEST(4, 12, -1, 0, 0),
|
||||||
|
EAST(5, 13, 1, 0, 0);
|
||||||
|
|
||||||
|
private int unpowered;
|
||||||
|
private int powered;
|
||||||
|
|
||||||
|
private int x;
|
||||||
|
private int y;
|
||||||
|
private int z;
|
||||||
|
|
||||||
|
HopperDirection(int unpowered, int powered, int x, int y, int z) {
|
||||||
|
this.unpowered = unpowered;
|
||||||
|
this.powered = powered;
|
||||||
|
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HopperDirection getDirection(int value) {
|
||||||
|
for (HopperDirection hopperDirection : HopperDirection.values()) {
|
||||||
|
if (hopperDirection.getPowered() == value
|
||||||
|
|| hopperDirection.getUnpowered() == value) return hopperDirection;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation(Location location) {
|
||||||
|
return location.add(getX(), getY(), getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getX() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getY() {
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getZ() {
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getUnpowered() {
|
||||||
|
return unpowered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPowered() {
|
||||||
|
return powered;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -647,7 +647,7 @@ public class EHopper implements Hopper {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Location> getLinkedBlocks() {
|
public List<Location> getLinkedBlocks() {
|
||||||
return Collections.unmodifiableList(linkedBlocks);
|
return new ArrayList<>(linkedBlocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -4,11 +4,13 @@ import com.songoda.epichoppers.EpicHoppersPlugin;
|
|||||||
import com.songoda.epichoppers.api.hopper.Hopper;
|
import com.songoda.epichoppers.api.hopper.Hopper;
|
||||||
import com.songoda.epichoppers.utils.Debugger;
|
import com.songoda.epichoppers.utils.Debugger;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.inventory.InventoryMoveItemEvent;
|
import org.bukkit.event.inventory.InventoryMoveItemEvent;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by songoda on 4/18/2017.
|
* Created by songoda on 4/18/2017.
|
||||||
@ -32,9 +34,11 @@ public class HopperListeners implements Listener {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Hopper hopper = instance.getHopperManager().getHopper(source.getLocation());
|
Hopper hopper = instance.getHopperManager().getHopper(source.getLocation());
|
||||||
if (hopper.getLinkedBlocks() == null || hopper.getLinkedBlocks().isEmpty()) {
|
if ((hopper.getLinkedBlocks() == null || hopper.getLinkedBlocks().isEmpty())) {
|
||||||
hopper.clearLinkedBlocks();
|
hopper.clearLinkedBlocks();
|
||||||
hopper.addLinkedBlock(event.getDestination().getLocation());
|
Location location = event.getDestination().getLocation();
|
||||||
|
if (location.getBlock() instanceof InventoryHolder)
|
||||||
|
hopper.addLinkedBlock(location);
|
||||||
}
|
}
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
} catch (Exception ee) {
|
} catch (Exception ee) {
|
||||||
|
Loading…
Reference in New Issue
Block a user