mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
Fixes #2926
This commit is contained in:
parent
5b517ea1b1
commit
5e87df873c
@ -60,7 +60,7 @@
|
|||||||
* Fixed #2650
|
* Fixed #2650
|
||||||
* Fixed Slimefun items applying damage to items with an `unbreakable` tag
|
* Fixed Slimefun items applying damage to items with an `unbreakable` tag
|
||||||
* Fixed #2930
|
* Fixed #2930
|
||||||
* Fixed #2837
|
* Fixed #2926
|
||||||
|
|
||||||
## Release Candidate 21 (14 Mar 2021)
|
## Release Candidate 21 (14 Mar 2021)
|
||||||
https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#21
|
https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#21
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.implementation.items.autocrafters;
|
package io.github.thebusybiscuit.slimefun4.implementation.items.autocrafters;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
@ -24,9 +26,9 @@ import org.bukkit.inventory.InventoryHolder;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.data.PersistentDataAPI;
|
import io.github.thebusybiscuit.cscorelib2.data.PersistentDataAPI;
|
||||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
|
||||||
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
||||||
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
|
||||||
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
|
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
|
||||||
import io.github.thebusybiscuit.slimefun4.api.items.ItemState;
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemState;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
import io.github.thebusybiscuit.slimefun4.core.attributes.EnergyNetComponent;
|
||||||
@ -415,6 +417,7 @@ public abstract class AbstractAutoCrafter extends SlimefunItem implements Energy
|
|||||||
// Check if we have an empty slot
|
// Check if we have an empty slot
|
||||||
if (inv.firstEmpty() != -1) {
|
if (inv.firstEmpty() != -1) {
|
||||||
Map<Integer, Integer> itemQuantities = new HashMap<>();
|
Map<Integer, Integer> itemQuantities = new HashMap<>();
|
||||||
|
List<ItemStack> leftoverItems = new ArrayList<>();
|
||||||
|
|
||||||
for (Predicate<ItemStack> predicate : recipe.getIngredients()) {
|
for (Predicate<ItemStack> predicate : recipe.getIngredients()) {
|
||||||
// Check if any Item matches the Predicate
|
// Check if any Item matches the Predicate
|
||||||
@ -429,19 +432,71 @@ public abstract class AbstractAutoCrafter extends SlimefunItem implements Energy
|
|||||||
|
|
||||||
// Double-check to be extra safe
|
// Double-check to be extra safe
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
// Consume the difference
|
// Handle leftovers
|
||||||
int toRemove = item.getAmount() - entry.getValue();
|
ItemStack leftover = getLeftoverItem(item);
|
||||||
ItemUtils.consumeItem(item, toRemove, true);
|
|
||||||
|
if (leftover != null) {
|
||||||
|
// Account for the amount of removed items
|
||||||
|
leftover.setAmount(item.getAmount() - entry.getValue());
|
||||||
|
leftoverItems.add(leftover);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the item amount
|
||||||
|
item.setAmount(entry.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// All Predicates have found a match
|
boolean success = inv.addItem(recipe.getResult().clone()).isEmpty();
|
||||||
return inv.addItem(recipe.getResult().clone()).isEmpty();
|
|
||||||
|
if (success) {
|
||||||
|
// Fixes #2926 - Push leftover items to the inventory.
|
||||||
|
for (ItemStack leftoverItem : leftoverItems) {
|
||||||
|
inv.addItem(leftoverItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the "leftovers" from a crafting operation.
|
||||||
|
* The method functions very similarly to {@link Material#getCraftingRemainingItem()}.
|
||||||
|
* However we cannot use this method as it is only available in the latest 1.16 snapshots
|
||||||
|
* of Spigot, not even on earlier 1.16 builds...
|
||||||
|
* But this gives us more control over the leftovers anyway!
|
||||||
|
*
|
||||||
|
* @param item
|
||||||
|
* The {@link ItemStack} that is being consumed
|
||||||
|
*
|
||||||
|
* @return The leftover item or null if the item is fully consumed
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private ItemStack getLeftoverItem(@Nonnull ItemStack item) {
|
||||||
|
Material type = item.getType();
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case WATER_BUCKET:
|
||||||
|
case LAVA_BUCKET:
|
||||||
|
case MILK_BUCKET:
|
||||||
|
return new ItemStack(Material.BUCKET);
|
||||||
|
case DRAGON_BREATH:
|
||||||
|
case POTION:
|
||||||
|
return new ItemStack(Material.GLASS_BOTTLE);
|
||||||
|
default:
|
||||||
|
MinecraftVersion minecraftVersion = SlimefunPlugin.getMinecraftVersion();
|
||||||
|
|
||||||
|
// Honey does not exist in 1.14
|
||||||
|
if (minecraftVersion.isAtLeast(MinecraftVersion.MINECRAFT_1_15) && type == Material.HONEY_BOTTLE) {
|
||||||
|
return new ItemStack(Material.GLASS_BOTTLE);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method returns the max amount of electricity this machine can hold.
|
* This method returns the max amount of electricity this machine can hold.
|
||||||
*
|
*
|
||||||
|
@ -98,6 +98,29 @@ class TestAutoCrafter {
|
|||||||
Assertions.assertFalse(inv.containsAtLeast(result, 1));
|
Assertions.assertFalse(inv.containsAtLeast(result, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("Test resource leftovers when crafting")
|
||||||
|
void testResourceLeftovers() {
|
||||||
|
NamespacedKey key = new NamespacedKey(plugin, "resource_leftovers_test");
|
||||||
|
ItemStack result = new CustomItem(Material.DIAMOND, "&9Diamond. Nuff said.");
|
||||||
|
ShapelessRecipe recipe = new ShapelessRecipe(key, result);
|
||||||
|
recipe.addIngredient(new MaterialChoice(Material.HONEY_BOTTLE));
|
||||||
|
recipe.addIngredient(new MaterialChoice(Material.HONEY_BOTTLE));
|
||||||
|
|
||||||
|
AbstractRecipe abstractRecipe = AbstractRecipe.of(recipe);
|
||||||
|
AbstractAutoCrafter crafter = getVanillaAutoCrafter();
|
||||||
|
InventoryMock inv = new ChestInventoryMock(null, 9);
|
||||||
|
|
||||||
|
inv.addItem(new ItemStack(Material.HONEY_BOTTLE, 2));
|
||||||
|
Assertions.assertTrue(crafter.craft(inv, abstractRecipe));
|
||||||
|
|
||||||
|
Assertions.assertFalse(inv.contains(Material.HONEY_BOTTLE, 2));
|
||||||
|
Assertions.assertTrue(inv.containsAtLeast(result, 1));
|
||||||
|
|
||||||
|
// Check for leftovers
|
||||||
|
Assertions.assertTrue(inv.contains(Material.GLASS_BOTTLE, 2));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@DisplayName("Test crafting an invalid ShapelessRecipe")
|
@DisplayName("Test crafting an invalid ShapelessRecipe")
|
||||||
void testInvalidShapelessRecipe() {
|
void testInvalidShapelessRecipe() {
|
||||||
|
Loading…
Reference in New Issue
Block a user