1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

[CI skip] Refactoring

This commit is contained in:
TheBusyBiscuit 2020-03-18 15:52:36 +01:00
parent 3cd31e2c2f
commit 4744fbac56
10 changed files with 319 additions and 320 deletions

View File

@ -50,6 +50,9 @@
* Added Makeshift Smeltery
* Added Tree Growth Accelerator
* Added "Glass to Glass Panes" recipe to the Electric Press
* Added "Snowballs to Snow blocks" recipe to the Electric Press
* Added "Snow blocks to Ice" recipe to the Freezer
* You can now use Cooked Salmon in an Auto Drier to craft Fish Jerky
* The Lumber Axe can now strip logs too
#### Changes

View File

@ -4,6 +4,7 @@ We got everything from magical wands to nuclear reactors.<br>
We feature a magical altar, an electric power grid and even item transport systems.
This project originally started back in 2013 and has grown ever since.<br>
From one single person working on this plugin back then, we grew to a community of thousands of players and over 100 of contributors to this project.<br>
It currently adds over **500 new items and recipes** to Minecraft ([Read more about the history of this project](https://github.com/TheBusyBiscuit/Slimefun4/wiki/Slimefun-in-a-nutshell)).
But it also comes with a lot of Addons too!<br>
@ -98,9 +99,11 @@ Slimefun4 has recently added suport for translations, note that translations are
So not everything may be available for translation yet.<br>
[Read more...](https://github.com/TheBusyBiscuit/Slimefun4/wiki/Translating-Slimefun)
## Data Collection
Slimefun4 uses various systems that collect or download data.<br>
We do not collect any personal information from you but here is a full list of what services may collect or download other kind of data.
## Disclaimer
Slimefun4 uses various systems that collect usage information or download automatic updates as well as the latest information about the project.<br>
We do __not__ collect any personal information from you but here is a full list of what services may collect or download other kinds of data.
You can opt-out of the Auto-Updater and stats collection at any time.
### Auto-Updates
Slimefun4 uses an Auto-Updater which connects to https://thebusybiscuit.github.io/builds/ to check for and download updates.<br>

View File

@ -75,6 +75,9 @@ public class AutoDrier extends AContainer implements RecipeDisplayItem {
recipeList.add(new ItemStack(Material.COOKED_COD));
recipeList.add(SlimefunItems.FISH_JERKY);
recipeList.add(new ItemStack(Material.COOKED_SALMON));
recipeList.add(SlimefunItems.FISH_JERKY);
}
@Override

View File

@ -59,6 +59,7 @@ public class AutoEnchanter extends AContainer {
@Override
protected void tick(Block b) {
BlockMenu menu = BlockStorage.getInventory(b.getLocation());
if (isProcessing(b)) {
int timeleft = progress.get(b);
@ -85,7 +86,8 @@ public class AutoEnchanter extends AContainer {
for (int slot : getInputSlots()) {
ItemStack target = menu.getItemInSlot(slot == getInputSlots()[0] ? getInputSlots()[1] : getInputSlots()[0]);
// Check if enchantable
// Check if the item is enchantable
SlimefunItem sfTarget = SlimefunItem.getByItem(target);
if (sfTarget != null && !sfTarget.isEnchantable()) return;

View File

@ -25,12 +25,14 @@ public abstract class ElectricFurnace extends AContainer {
public void registerDefaultRecipes() {
Iterator<Recipe> iterator = Bukkit.recipeIterator();
while (iterator.hasNext()) {
Recipe r = iterator.next();
if (r instanceof CookingRecipe) {
RecipeChoice choice = ((CookingRecipe<?>) r).getInputChoice();
Recipe recipe = iterator.next();
if (recipe instanceof CookingRecipe) {
RecipeChoice choice = ((CookingRecipe<?>) recipe).getInputChoice();
if (choice instanceof MaterialChoice) {
for (Material input : ((MaterialChoice) choice).getChoices()) {
registerRecipe(4, new ItemStack[] { new ItemStack(input) }, new ItemStack[] { r.getResult() });
registerRecipe(4, new ItemStack[] { new ItemStack(input) }, new ItemStack[] { recipe.getResult() });
}
}
}

View File

@ -8,7 +8,6 @@ import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineRecipe;
@ -39,19 +38,6 @@ public class ElectricIngotPulverizer extends AContainer implements RecipeDisplay
return new ItemStack(Material.IRON_PICKAXE);
}
@Override
protected void registerDefaultRecipes() {
registerRecipe(3, new ItemStack[] { SlimefunItems.ALUMINUM_INGOT }, new ItemStack[] { SlimefunItems.ALUMINUM_DUST });
registerRecipe(3, new ItemStack[] { SlimefunItems.COPPER_INGOT }, new ItemStack[] { SlimefunItems.COPPER_DUST });
registerRecipe(3, new ItemStack[] { SlimefunItems.GOLD_4K }, new ItemStack[] { SlimefunItems.GOLD_DUST });
registerRecipe(3, new ItemStack[] { new ItemStack(Material.IRON_INGOT) }, new ItemStack[] { SlimefunItems.IRON_DUST });
registerRecipe(3, new ItemStack[] { SlimefunItems.LEAD_INGOT }, new ItemStack[] { SlimefunItems.LEAD_DUST });
registerRecipe(3, new ItemStack[] { SlimefunItems.MAGNESIUM_INGOT }, new ItemStack[] { SlimefunItems.MAGNESIUM_DUST });
registerRecipe(3, new ItemStack[] { SlimefunItems.SILVER_INGOT }, new ItemStack[] { SlimefunItems.SILVER_DUST });
registerRecipe(3, new ItemStack[] { SlimefunItems.TIN_INGOT }, new ItemStack[] { SlimefunItems.TIN_DUST });
registerRecipe(3, new ItemStack[] { SlimefunItems.ZINC_INGOT }, new ItemStack[] { SlimefunItems.ZINC_DUST });
}
@Override
public List<ItemStack> getDisplayRecipes() {
List<ItemStack> displayRecipes = new ArrayList<>(recipes.size() * 2);

View File

@ -22,7 +22,8 @@ public abstract class ElectricPress extends AContainer implements RecipeDisplayI
addRecipe(4, new CustomItem(SlimefunItems.STONE_CHUNK, 3), new ItemStack(Material.COBBLESTONE));
addRecipe(4, new ItemStack(Material.FLINT, 6), new ItemStack(Material.COBBLESTONE));
addRecipe(5, new ItemStack(Material.GLASS), new ItemStack(Material.GLASS_PANE, 3));
addRecipe(4, new ItemStack(Material.SNOWBALL, 4), new ItemStack(Material.SNOW_BLOCK));
addRecipe(6, SlimefunItems.COPPER_INGOT, new CustomItem(SlimefunItems.COPPER_WIRE, 3));
addRecipe(16, new CustomItem(SlimefunItems.STEEL_INGOT, 8), SlimefunItems.STEEL_PLATE);
addRecipe(18, new CustomItem(SlimefunItems.REINFORCED_ALLOY_INGOT, 8), SlimefunItems.REINFORCED_PLATE);

View File

@ -27,6 +27,7 @@ public abstract class Freezer extends AContainer implements RecipeDisplayItem {
registerRecipe(4, new ItemStack[] { new ItemStack(Material.ICE) }, new ItemStack[] { new ItemStack(Material.PACKED_ICE) });
registerRecipe(6, new ItemStack[] { new ItemStack(Material.PACKED_ICE) }, new ItemStack[] { new ItemStack(Material.BLUE_ICE) });
registerRecipe(8, new ItemStack[] { new ItemStack(Material.BLUE_ICE) }, new ItemStack[] { SlimefunItems.REACTOR_COOLANT_CELL });
registerRecipe(6, new ItemStack[] { new ItemStack(Material.SNOW_BLOCK, 2) }, new ItemStack[] { new ItemStack(Material.ICE) });
}
@Override

View File

@ -183,7 +183,9 @@ public final class PostSetup {
// We want to exclude Dust to Ingot Recipes
if (inputs.size() == 1 && isDust(inputs.get(0))) {
((MakeshiftSmeltery) SlimefunItems.MAKESHIFT_SMELTERY.getItem()).addRecipe(new ItemStack[] { inputs.get(0) }, recipe[0]);
registerMachineRecipe("ELECTRIC_INGOT_FACTORY", 8, new ItemStack[] { inputs.get(0) }, new ItemStack[] { recipe[0] });
registerMachineRecipe("ELECTRIC_INGOT_PULVERIZER", 3, new ItemStack[] { recipe[0] }, new ItemStack[] { inputs.get(0) });
}
else {
registerMachineRecipe("ELECTRIC_SMELTERY", 12, inputs.toArray(new ItemStack[0]), new ItemStack[] { recipe[0] });

View File

@ -44,8 +44,8 @@ public class CargoNet extends Network {
private static final int[] slots = { 19, 20, 21, 28, 29, 30, 37, 38, 39 };
// Chest Terminal Stuff
public static final int[] TERMINAL_SLOTS = { 0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42 };
public static final int TERMINAL_OUT_SLOT = 17;
private static final int[] TERMINAL_SLOTS = { 0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42 };
private static final int TERMINAL_OUT_SLOT = 17;
private final ItemStack terminalPlaceholderItem = new CustomItem(new ItemStack(Material.BARRIER), "&4No Item cached");
@ -75,11 +75,6 @@ public class CargoNet extends Network {
return cargoNetwork;
}
@Deprecated
public static boolean isConnected(Block b) {
return getNetworkFromLocation(b.getLocation()) != null;
}
protected CargoNet(Location l) {
super(l);
}
@ -197,324 +192,325 @@ public class CargoNet extends Network {
}
}
Slimefun.runSync(() -> {
Slimefun.runSync(() -> run(b, providers, destinations, output));
}
}
private void run(Block b, Set<Location> providers, Set<Location> destinations, Map<Integer, List<Location>> output) {
if (BlockStorage.getLocationInfo(b.getLocation(), "visualizer") == null) {
display();
}
if (BlockStorage.getLocationInfo(b.getLocation(), "visualizer") == null) {
display();
}
// Chest Terminal Code
if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) {
for (Location bus : imports) {
BlockMenu menu = BlockStorage.getInventory(bus);
// Chest Terminal Code
if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) {
for (Location bus : imports) {
BlockMenu menu = BlockStorage.getInventory(bus);
if (menu.getItemInSlot(17) == null) {
Block target = getAttachedBlock(bus.getBlock());
ItemStackAndInteger stack = CargoUtils.withdraw(bus.getBlock(), target, -1);
if (stack != null) {
menu.replaceExistingItem(17, stack.getItem());
}
}
if (menu.getItemInSlot(17) != null) {
itemRequests.add(new ItemRequest(bus, 17, menu.getItemInSlot(17), ItemTransportFlow.INSERT));
}
}
for (Location bus : exports) {
BlockMenu menu = BlockStorage.getInventory(bus);
if (menu.getItemInSlot(17) != null) {
Block target = getAttachedBlock(bus.getBlock());
menu.replaceExistingItem(17, CargoUtils.insert(bus.getBlock(), target, menu.getItemInSlot(17), -1));
}
if (menu.getItemInSlot(17) == null) {
List<ItemStack> items = new ArrayList<>();
for (int slot : slots) {
ItemStack template = menu.getItemInSlot(slot);
if (template != null) items.add(new CustomItem(template, 1));
}
if (!items.isEmpty()) {
int index = Integer.parseInt(BlockStorage.getLocationInfo(bus, "index"));
index++;
if (index > (items.size() - 1)) index = 0;
BlockStorage.addBlockInfo(bus, "index", String.valueOf(index));
itemRequests.add(new ItemRequest(bus, 17, items.get(index), ItemTransportFlow.WITHDRAW));
}
}
}
for (Location terminal : terminals) {
BlockMenu menu = BlockStorage.getInventory(terminal);
ItemStack sendingItem = menu.getItemInSlot(TERMINAL_OUT_SLOT);
if (sendingItem != null) {
itemRequests.add(new ItemRequest(terminal, TERMINAL_OUT_SLOT, sendingItem, ItemTransportFlow.INSERT));
}
}
Iterator<ItemRequest> iterator = itemRequests.iterator();
while (iterator.hasNext()) {
ItemRequest request = iterator.next();
if (terminals.contains(request.getTerminal()) || imports.contains(request.getTerminal()) || exports.contains(request.getTerminal())) {
BlockMenu menu = BlockStorage.getInventory(request.getTerminal());
switch (request.getDirection()) {
case INSERT:
ItemStack requestedItem = request.getItem();
for (Location l : destinations) {
Block target = getAttachedBlock(l.getBlock());
requestedItem = CargoUtils.insert(l.getBlock(), target, requestedItem, -1);
if (requestedItem == null) {
menu.replaceExistingItem(request.getSlot(), null);
break;
}
}
if (requestedItem != null) {
menu.replaceExistingItem(request.getSlot(), requestedItem);
}
iterator.remove();
break;
case WITHDRAW:
int slot = request.getSlot();
ItemStack prevStack = menu.getItemInSlot(slot);
if (!(prevStack == null || (prevStack.getAmount() + request.getItem().getAmount() <= prevStack.getMaxStackSize() && SlimefunManager.isItemSimilar(prevStack, new CustomItem(request.getItem(), 1), true)))) {
iterator.remove();
break;
}
ItemStack stack = null;
ItemStack requested = request.getItem();
for (Location l : providers) {
Block target = getAttachedBlock(l.getBlock());
ItemStack is = CargoUtils.withdraw(l.getBlock(), target, requested);
if (is != null) {
if (stack == null) {
stack = is;
}
else {
stack = new CustomItem(stack, stack.getAmount() + is.getAmount());
}
if (is.getAmount() == requested.getAmount()) {
break;
}
else {
requested = new CustomItem(requested, requested.getAmount() - is.getAmount());
}
}
}
if (stack != null) {
ItemStack prev = menu.getItemInSlot(slot);
if (prev == null) menu.replaceExistingItem(slot, stack);
else menu.replaceExistingItem(slot, new CustomItem(stack, stack.getAmount() + prev.getAmount()));
}
iterator.remove();
break;
default:
break;
}
}
}
}
// All operations happen here: Everything gets iterated from the Input Nodes. (Apart from ChestTerminal
// Buses)
for (Location input : inputNodes) {
int frequency = getFrequency(input);
if (frequency < 0 || frequency > 15) {
continue;
}
Block inputTarget = getAttachedBlock(input.getBlock());
ItemStack stack = null;
int previousSlot = -1;
Config cfg = BlockStorage.getLocationInfo(input);
boolean roundrobin = "true".equals(cfg.getString("round-robin"));
if (inputTarget != null) {
ItemStackAndInteger slot = CargoUtils.withdraw(input.getBlock(), inputTarget, Integer.parseInt(cfg.getString("index")));
if (slot != null) {
stack = slot.getItem();
previousSlot = slot.getInt();
}
}
if (menu.getItemInSlot(17) == null) {
Block target = getAttachedBlock(bus.getBlock());
ItemStackAndInteger stack = CargoUtils.withdraw(bus.getBlock(), target, -1);
if (stack != null) {
List<Location> outputs = output.get(frequency);
if (outputs != null) {
List<Location> outputlist = new ArrayList<>(outputs);
if (roundrobin) {
int cIndex = roundRobin.getOrDefault(input, 0);
if (cIndex < outputlist.size()) {
for (int i = 0; i < cIndex; i++) {
Location temp = outputlist.get(0);
outputlist.remove(temp);
outputlist.add(temp);
}
cIndex++;
}
else cIndex = 1;
roundRobin.put(input, cIndex);
}
for (Location out : outputlist) {
Block target = getAttachedBlock(out.getBlock());
if (target != null) {
stack = CargoUtils.insert(out.getBlock(), target, stack, -1);
if (stack == null) break;
}
}
}
}
if (stack != null && previousSlot > -1) {
DirtyChestMenu menu = CargoUtils.getChestMenu(inputTarget);
if (menu != null) {
menu.replaceExistingItem(previousSlot, stack);
}
else {
BlockState state = inputTarget.getState();
if (state instanceof InventoryHolder) {
Inventory inv = ((InventoryHolder) state).getInventory();
inv.setItem(previousSlot, stack);
}
}
menu.replaceExistingItem(17, stack.getItem());
}
}
// Chest Terminal Code
if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) {
List<ItemStackAndInteger> items = new ArrayList<>();
if (menu.getItemInSlot(17) != null) {
itemRequests.add(new ItemRequest(bus, 17, menu.getItemInSlot(17), ItemTransportFlow.INSERT));
}
}
for (Location l : providers) {
Block target = getAttachedBlock(l.getBlock());
UniversalBlockMenu menu = BlockStorage.getUniversalInventory(target);
for (Location bus : exports) {
BlockMenu menu = BlockStorage.getInventory(bus);
if (menu != null) {
for (int slot : menu.getPreset().getSlotsAccessedByItemTransport((DirtyChestMenu) menu, ItemTransportFlow.WITHDRAW, null)) {
ItemStack is = menu.getItemInSlot(slot);
filter(is, items, l);
}
}
else if (BlockStorage.hasInventory(target)) {
BlockMenu blockMenu = BlockStorage.getInventory(target);
Config cfg = BlockStorage.getLocationInfo(target.getLocation());
if (menu.getItemInSlot(17) != null) {
Block target = getAttachedBlock(bus.getBlock());
if (cfg.getString("id").startsWith("BARREL_") && cfg.getString("storedItems") != null) {
int stored = Integer.parseInt(cfg.getString("storedItems"));
menu.replaceExistingItem(17, CargoUtils.insert(bus.getBlock(), target, menu.getItemInSlot(17), -1));
}
for (int slot : blockMenu.getPreset().getSlotsAccessedByItemTransport((DirtyChestMenu) blockMenu, ItemTransportFlow.WITHDRAW, null)) {
ItemStack is = blockMenu.getItemInSlot(slot);
if (is != null && CargoUtils.matchesFilter(l.getBlock(), is, -1)) {
boolean add = true;
for (ItemStackAndInteger item : items) {
if (SlimefunManager.isItemSimilar(is, item.getItem(), true)) {
add = false;
item.add(is.getAmount() + stored);
}
}
if (add) {
items.add(new ItemStackAndInteger(new CustomItem(is, 1), is.getAmount() + stored));
}
}
}
}
else {
handleWithdraw(blockMenu, items, l);
}
}
else {
BlockState state = target.getState();
if (state instanceof InventoryHolder) {
Inventory inv = ((InventoryHolder) state).getInventory();
for (ItemStack is : inv.getContents()) {
filter(is, items, l);
}
}
}
if (menu.getItemInSlot(17) == null) {
List<ItemStack> items = new ArrayList<>();
for (int slot : slots) {
ItemStack template = menu.getItemInSlot(slot);
if (template != null) items.add(new CustomItem(template, 1));
}
Collections.sort(items, Comparator.comparingInt(item -> -item.getInt()));
if (!items.isEmpty()) {
int index = Integer.parseInt(BlockStorage.getLocationInfo(bus, "index"));
for (Location l : terminals) {
BlockMenu menu = BlockStorage.getInventory(l);
int page = Integer.parseInt(BlockStorage.getLocationInfo(l, "page"));
index++;
if (index > (items.size() - 1)) index = 0;
if (!items.isEmpty() && items.size() < (page - 1) * TERMINAL_SLOTS.length + 1) {
page = 1;
BlockStorage.addBlockInfo(l, "page", String.valueOf(1));
BlockStorage.addBlockInfo(bus, "index", String.valueOf(index));
itemRequests.add(new ItemRequest(bus, 17, items.get(index), ItemTransportFlow.WITHDRAW));
}
}
}
for (Location terminal : terminals) {
BlockMenu menu = BlockStorage.getInventory(terminal);
ItemStack sendingItem = menu.getItemInSlot(TERMINAL_OUT_SLOT);
if (sendingItem != null) {
itemRequests.add(new ItemRequest(terminal, TERMINAL_OUT_SLOT, sendingItem, ItemTransportFlow.INSERT));
}
}
Iterator<ItemRequest> iterator = itemRequests.iterator();
while (iterator.hasNext()) {
ItemRequest request = iterator.next();
if (terminals.contains(request.getTerminal()) || imports.contains(request.getTerminal()) || exports.contains(request.getTerminal())) {
BlockMenu menu = BlockStorage.getInventory(request.getTerminal());
switch (request.getDirection()) {
case INSERT:
ItemStack requestedItem = request.getItem();
for (Location l : destinations) {
Block target = getAttachedBlock(l.getBlock());
requestedItem = CargoUtils.insert(l.getBlock(), target, requestedItem, -1);
if (requestedItem == null) {
menu.replaceExistingItem(request.getSlot(), null);
break;
}
}
for (int i = 0; i < TERMINAL_SLOTS.length; i++) {
int slot = TERMINAL_SLOTS[i];
if (requestedItem != null) {
menu.replaceExistingItem(request.getSlot(), requestedItem);
}
if (items.size() > i + (TERMINAL_SLOTS.length * (page - 1))) {
ItemStackAndInteger item = items.get(i + (TERMINAL_SLOTS.length * (page - 1)));
iterator.remove();
break;
case WITHDRAW:
int slot = request.getSlot();
ItemStack prevStack = menu.getItemInSlot(slot);
ItemStack stack = item.getItem().clone();
ItemMeta im = stack.getItemMeta();
List<String> lore = new ArrayList<>();
lore.add("");
lore.add(ChatColors.color("&7Stored Items: &r" + DoubleHandler.getFancyDouble(item.getInt())));
if (!(prevStack == null || (prevStack.getAmount() + request.getItem().getAmount() <= prevStack.getMaxStackSize() && SlimefunManager.isItemSimilar(prevStack, new CustomItem(request.getItem(), 1), true)))) {
iterator.remove();
break;
}
if (stack.getMaxStackSize() > 1) lore.add(ChatColors.color("&7<Left Click: Request 1 | Right Click: Request " + (item.getInt() > stack.getMaxStackSize() ? stack.getMaxStackSize() : item.getInt()) + ">"));
else lore.add(ChatColors.color("&7<Left Click: Request 1>"));
ItemStack stack = null;
ItemStack requested = request.getItem();
lore.add("");
if (im.hasLore()) {
lore.addAll(im.getLore());
for (Location l : providers) {
Block target = getAttachedBlock(l.getBlock());
ItemStack is = CargoUtils.withdraw(l.getBlock(), target, requested);
if (is != null) {
if (stack == null) {
stack = is;
}
else {
stack = new CustomItem(stack, stack.getAmount() + is.getAmount());
}
im.setLore(lore);
stack.setItemMeta(im);
menu.replaceExistingItem(slot, stack);
menu.addMenuClickHandler(slot, (p, sl, is, action) -> {
int amount = item.getInt() > item.getItem().getMaxStackSize() ? item.getItem().getMaxStackSize() : item.getInt();
itemRequests.add(new ItemRequest(l, 44, new CustomItem(item.getItem(), action.isRightClicked() ? amount : 1), ItemTransportFlow.WITHDRAW));
return false;
});
if (is.getAmount() == requested.getAmount()) {
break;
}
else {
requested = new CustomItem(requested, requested.getAmount() - is.getAmount());
}
}
}
if (stack != null) {
ItemStack prev = menu.getItemInSlot(slot);
if (prev == null) menu.replaceExistingItem(slot, stack);
else menu.replaceExistingItem(slot, new CustomItem(stack, stack.getAmount() + prev.getAmount()));
}
iterator.remove();
break;
default:
break;
}
}
}
}
// All operations happen here: Everything gets iterated from the Input Nodes. (Apart from ChestTerminal
// Buses)
for (Location input : inputNodes) {
int frequency = getFrequency(input);
if (frequency < 0 || frequency > 15) {
continue;
}
Block inputTarget = getAttachedBlock(input.getBlock());
ItemStack stack = null;
int previousSlot = -1;
Config cfg = BlockStorage.getLocationInfo(input);
boolean roundrobin = "true".equals(cfg.getString("round-robin"));
if (inputTarget != null) {
ItemStackAndInteger slot = CargoUtils.withdraw(input.getBlock(), inputTarget, Integer.parseInt(cfg.getString("index")));
if (slot != null) {
stack = slot.getItem();
previousSlot = slot.getInt();
}
}
if (stack != null) {
List<Location> outputs = output.get(frequency);
if (outputs != null) {
List<Location> outputlist = new ArrayList<>(outputs);
if (roundrobin) {
int cIndex = roundRobin.getOrDefault(input, 0);
if (cIndex < outputlist.size()) {
for (int i = 0; i < cIndex; i++) {
Location temp = outputlist.get(0);
outputlist.remove(temp);
outputlist.add(temp);
}
else {
menu.replaceExistingItem(slot, terminalPlaceholderItem);
menu.addMenuClickHandler(slot, ChestMenuUtils.getEmptyClickHandler());
}
cIndex++;
}
else cIndex = 1;
roundRobin.put(input, cIndex);
}
for (Location out : outputlist) {
Block target = getAttachedBlock(out.getBlock());
if (target != null) {
stack = CargoUtils.insert(out.getBlock(), target, stack, -1);
if (stack == null) break;
}
}
}
});
}
if (stack != null && previousSlot > -1) {
DirtyChestMenu menu = CargoUtils.getChestMenu(inputTarget);
if (menu != null) {
menu.replaceExistingItem(previousSlot, stack);
}
else {
BlockState state = inputTarget.getState();
if (state instanceof InventoryHolder) {
Inventory inv = ((InventoryHolder) state).getInventory();
inv.setItem(previousSlot, stack);
}
}
}
}
// Chest Terminal Code
if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) {
List<ItemStackAndInteger> items = new ArrayList<>();
for (Location l : providers) {
Block target = getAttachedBlock(l.getBlock());
UniversalBlockMenu menu = BlockStorage.getUniversalInventory(target);
if (menu != null) {
for (int slot : menu.getPreset().getSlotsAccessedByItemTransport((DirtyChestMenu) menu, ItemTransportFlow.WITHDRAW, null)) {
ItemStack is = menu.getItemInSlot(slot);
filter(is, items, l);
}
}
else if (BlockStorage.hasInventory(target)) {
BlockMenu blockMenu = BlockStorage.getInventory(target);
Config cfg = BlockStorage.getLocationInfo(target.getLocation());
if (cfg.getString("id").startsWith("BARREL_") && cfg.getString("storedItems") != null) {
int stored = Integer.parseInt(cfg.getString("storedItems"));
for (int slot : blockMenu.getPreset().getSlotsAccessedByItemTransport((DirtyChestMenu) blockMenu, ItemTransportFlow.WITHDRAW, null)) {
ItemStack is = blockMenu.getItemInSlot(slot);
if (is != null && CargoUtils.matchesFilter(l.getBlock(), is, -1)) {
boolean add = true;
for (ItemStackAndInteger item : items) {
if (SlimefunManager.isItemSimilar(is, item.getItem(), true)) {
add = false;
item.add(is.getAmount() + stored);
}
}
if (add) {
items.add(new ItemStackAndInteger(new CustomItem(is, 1), is.getAmount() + stored));
}
}
}
}
else {
handleWithdraw(blockMenu, items, l);
}
}
else {
BlockState state = target.getState();
if (state instanceof InventoryHolder) {
Inventory inv = ((InventoryHolder) state).getInventory();
for (ItemStack is : inv.getContents()) {
filter(is, items, l);
}
}
}
}
Collections.sort(items, Comparator.comparingInt(item -> -item.getInt()));
for (Location l : terminals) {
BlockMenu menu = BlockStorage.getInventory(l);
int page = Integer.parseInt(BlockStorage.getLocationInfo(l, "page"));
if (!items.isEmpty() && items.size() < (page - 1) * TERMINAL_SLOTS.length + 1) {
page = 1;
BlockStorage.addBlockInfo(l, "page", String.valueOf(1));
}
for (int i = 0; i < TERMINAL_SLOTS.length; i++) {
int slot = TERMINAL_SLOTS[i];
if (items.size() > i + (TERMINAL_SLOTS.length * (page - 1))) {
ItemStackAndInteger item = items.get(i + (TERMINAL_SLOTS.length * (page - 1)));
ItemStack stack = item.getItem().clone();
ItemMeta im = stack.getItemMeta();
List<String> lore = new ArrayList<>();
lore.add("");
lore.add(ChatColors.color("&7Stored Items: &r" + DoubleHandler.getFancyDouble(item.getInt())));
if (stack.getMaxStackSize() > 1) lore.add(ChatColors.color("&7<Left Click: Request 1 | Right Click: Request " + (item.getInt() > stack.getMaxStackSize() ? stack.getMaxStackSize() : item.getInt()) + ">"));
else lore.add(ChatColors.color("&7<Left Click: Request 1>"));
lore.add("");
if (im.hasLore()) {
lore.addAll(im.getLore());
}
im.setLore(lore);
stack.setItemMeta(im);
menu.replaceExistingItem(slot, stack);
menu.addMenuClickHandler(slot, (p, sl, is, action) -> {
int amount = item.getInt() > item.getItem().getMaxStackSize() ? item.getItem().getMaxStackSize() : item.getInt();
itemRequests.add(new ItemRequest(l, 44, new CustomItem(item.getItem(), action.isRightClicked() ? amount : 1), ItemTransportFlow.WITHDRAW));
return false;
});
}
else {
menu.replaceExistingItem(slot, terminalPlaceholderItem);
menu.addMenuClickHandler(slot, ChestMenuUtils.getEmptyClickHandler());
}
}
}
}
}