mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
added compatibility for the 1.20 smithing table
This commit is contained in:
parent
4746cbc6f9
commit
7472552e1e
@ -2,14 +2,13 @@ package io.github.thebusybiscuit.slimefun4.implementation.listeners.crafting;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event.Result;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.event.inventory.PrepareSmithingEvent;
|
||||
import org.bukkit.event.inventory.SmithItemEvent;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
|
||||
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
||||
|
||||
@ -18,6 +17,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
||||
* smithing table.
|
||||
*
|
||||
* @author Sefiraat
|
||||
* @author iTwins
|
||||
*/
|
||||
public class SmithingTableListener implements SlimefunCraftingListener {
|
||||
|
||||
@ -26,15 +26,29 @@ public class SmithingTableListener implements SlimefunCraftingListener {
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onSmith(InventoryClickEvent e) {
|
||||
if (e.getInventory().getType() == InventoryType.SMITHING && e.getRawSlot() == 2 && e.getWhoClicked() instanceof Player) {
|
||||
ItemStack materialItem = e.getInventory().getContents()[1];
|
||||
|
||||
// Checks if the item in the Material/Netherite slot is allowed to be used.
|
||||
if (isUnallowed(materialItem)) {
|
||||
public void onSmith(SmithItemEvent e) {
|
||||
SlimefunItem sfItem = SlimefunItem.getByItem(e.getInventory().getContents()[materialSlot()]);
|
||||
if (sfItem != null && !sfItem.isUseableInWorkbench()) {
|
||||
e.setResult(Result.DENY);
|
||||
Slimefun.getLocalization().sendMessage(e.getWhoClicked(), "smithing_table.not-working", true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onPrepareSmith(PrepareSmithingEvent e) {
|
||||
if (e.getInventory().getResult() != null) {
|
||||
SlimefunItem sfItem = SlimefunItem.getByItem(e.getInventory().getContents()[materialSlot()]);
|
||||
if (sfItem != null && !sfItem.isUseableInWorkbench()) {
|
||||
e.setResult(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int materialSlot() {
|
||||
if (Slimefun.getMinecraftVersion().isAtLeast(MinecraftVersion.MINECRAFT_1_20)) {
|
||||
return 2;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,21 +1,26 @@
|
||||
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
|
||||
|
||||
import be.seeseemelk.mockbukkit.MockBukkit;
|
||||
import be.seeseemelk.mockbukkit.ServerMock;
|
||||
|
||||
import org.apache.commons.lang3.mutable.MutableObject;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event.Result;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.inventory.InventoryAction;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.event.inventory.InventoryType.SlotType;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.event.inventory.PrepareSmithingEvent;
|
||||
import org.bukkit.event.inventory.SmithItemEvent;
|
||||
import org.bukkit.inventory.InventoryView;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.SmithingInventory;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import io.github.bakedlibs.dough.items.CustomItemStack;
|
||||
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
|
||||
@ -24,15 +29,13 @@ import io.github.thebusybiscuit.slimefun4.implementation.items.VanillaItem;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.listeners.crafting.SmithingTableListener;
|
||||
import io.github.thebusybiscuit.slimefun4.test.TestUtilities;
|
||||
|
||||
import be.seeseemelk.mockbukkit.MockBukkit;
|
||||
import be.seeseemelk.mockbukkit.ServerMock;
|
||||
|
||||
class TestSmithingTableListener {
|
||||
|
||||
private static SmithingTableListener listener;
|
||||
private static ServerMock server;
|
||||
|
||||
private static SlimefunItem slimefunIngot;
|
||||
private static SlimefunItem usableSlimefunIngot;
|
||||
private static SlimefunItem slimefunTool;
|
||||
private static VanillaItem vanillaIngot;
|
||||
private static VanillaItem vanillaTool;
|
||||
@ -45,11 +48,15 @@ class TestSmithingTableListener {
|
||||
|
||||
slimefunTool = TestUtilities.mockSlimefunItem(plugin, "MOCK_DIAMOND_SWORD", new CustomItemStack(Material.DIAMOND_SWORD, "&6Mock"));
|
||||
slimefunIngot = TestUtilities.mockSlimefunItem(plugin, "MOCK_NETHERITE_INGOT", new CustomItemStack(Material.NETHERITE_INGOT, "&6Mock"));
|
||||
usableSlimefunIngot = TestUtilities.mockSlimefunItem(plugin, "MOCK_NETHERITE_INGOT_USABLE", new CustomItemStack(Material.NETHERITE_INGOT, "&6Mock"));
|
||||
usableSlimefunIngot.setUseableInWorkbench(true);
|
||||
|
||||
vanillaTool = TestUtilities.mockVanillaItem(plugin, Material.DIAMOND_SWORD, true);
|
||||
vanillaIngot = TestUtilities.mockVanillaItem(plugin, Material.NETHERITE_INGOT, true);
|
||||
|
||||
slimefunTool.register(plugin);
|
||||
slimefunIngot.register(plugin);
|
||||
usableSlimefunIngot.register(plugin);
|
||||
vanillaTool.register(plugin);
|
||||
vanillaIngot.register(plugin);
|
||||
}
|
||||
@ -59,77 +66,182 @@ class TestSmithingTableListener {
|
||||
MockBukkit.unmock();
|
||||
}
|
||||
|
||||
private InventoryClickEvent mockSmithingEvent(ItemStack tool, ItemStack material) {
|
||||
private SmithItemEvent mockSmithingEvent(ItemStack tool, ItemStack material) {
|
||||
Player player = server.addPlayer();
|
||||
Inventory inv = TestUtilities.mockInventory(InventoryType.SMITHING, tool, material, null);
|
||||
|
||||
SmithingInventory inv = Mockito.mock(SmithingInventory.class);
|
||||
// MinecraftVersion#isAtLeast always returns true during unit test, so we use the 1.20 layout here.
|
||||
Mockito.when(inv.getContents()).thenReturn(new ItemStack[] { new ItemStack(Material.NETHERITE_UPGRADE_SMITHING_TEMPLATE), tool, material, null });
|
||||
|
||||
InventoryView view = player.openInventory(inv);
|
||||
InventoryClickEvent event = new InventoryClickEvent(view, SlotType.CONTAINER, 2, ClickType.LEFT, InventoryAction.PICKUP_ONE);
|
||||
SmithItemEvent event = new SmithItemEvent(view, SlotType.RESULT, 3, ClickType.LEFT, InventoryAction.PICKUP_ONE);
|
||||
|
||||
listener.onSmith(event);
|
||||
return event;
|
||||
}
|
||||
|
||||
private PrepareSmithingEvent mockPrepareSmithingEvent(ItemStack tool, ItemStack material) {
|
||||
Player player = server.addPlayer();
|
||||
|
||||
SmithingInventory inv = Mockito.mock(SmithingInventory.class);
|
||||
MutableObject<ItemStack> result = new MutableObject<>(new ItemStack(Material.NETHERITE_PICKAXE));
|
||||
|
||||
Mockito.doAnswer(invocation -> {
|
||||
ItemStack argument = invocation.getArgument(0);
|
||||
result.setValue(argument);
|
||||
return null;
|
||||
}).when(inv).setResult(Mockito.any());
|
||||
|
||||
Mockito.when(inv.getResult()).thenAnswer(invocation -> result.getValue());
|
||||
// MinecraftVersion#isAtLeast always returns true during unit test, so we use the 1.20 layout here.
|
||||
Mockito.when(inv.getContents()).thenReturn(new ItemStack[] { new ItemStack(Material.NETHERITE_UPGRADE_SMITHING_TEMPLATE), tool, material, null });
|
||||
|
||||
InventoryView view = player.openInventory(inv);
|
||||
PrepareSmithingEvent event = new PrepareSmithingEvent(view, result.getValue());
|
||||
|
||||
listener.onPrepareSmith(event);
|
||||
return event;
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that vanilla is unchanged (ItemStack tool x ItemStack material)")
|
||||
void testSmithingTableWithItemStacks() {
|
||||
InventoryClickEvent event = mockSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), new ItemStack(Material.NETHERITE_INGOT));
|
||||
SmithItemEvent event = mockSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), new ItemStack(Material.NETHERITE_INGOT));
|
||||
Assertions.assertEquals(Result.DEFAULT, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItem material doesn't work (ItemStack tool x SlimefunItem material)")
|
||||
void testSmithingTableWithItemStackAndSlimefunItem() {
|
||||
InventoryClickEvent event = mockSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), slimefunIngot.getItem());
|
||||
SmithItemEvent event = mockSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), slimefunIngot.getItem());
|
||||
Assertions.assertEquals(Result.DENY, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that VanillaItem material works (ItemStack tool x VanillaItem material)")
|
||||
void testSmithingTableWithItemStackAndVanillaItem() {
|
||||
InventoryClickEvent event = mockSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), vanillaIngot.getItem());
|
||||
SmithItemEvent event = mockSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), vanillaIngot.getItem());
|
||||
Assertions.assertEquals(Result.DEFAULT, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can upgrade with vanilla (SlimefunItem tool x ItemStack material)")
|
||||
void testSmithingTableWithSlimefunItemAndItemStack() {
|
||||
InventoryClickEvent event = mockSmithingEvent(slimefunTool.getItem(), new ItemStack(Material.NETHERITE_INGOT));
|
||||
SmithItemEvent event = mockSmithingEvent(slimefunTool.getItem(), new ItemStack(Material.NETHERITE_INGOT));
|
||||
Assertions.assertEquals(Result.DEFAULT, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can't upgrade with SlimefunItem materials (SlimefunItem tool x SlimefunItem material)")
|
||||
void testSmithingTableWithSlimefunItems() {
|
||||
InventoryClickEvent event = mockSmithingEvent(slimefunTool.getItem(), slimefunIngot.getItem());
|
||||
SmithItemEvent event = mockSmithingEvent(slimefunTool.getItem(), slimefunIngot.getItem());
|
||||
Assertions.assertEquals(Result.DENY, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can upgrade with VanillaItems (SlimefunItem tool x VanillaItem material)")
|
||||
void testSmithingTableWithSlimefunItemAndVanillaItem() {
|
||||
InventoryClickEvent event = mockSmithingEvent(slimefunTool.getItem(), vanillaIngot.getItem());
|
||||
SmithItemEvent event = mockSmithingEvent(slimefunTool.getItem(), vanillaIngot.getItem());
|
||||
Assertions.assertEquals(Result.DEFAULT, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can upgrade with vanilla (SlimefunItem tool x ItemStack material)")
|
||||
@DisplayName("Test that VanillaItems can upgrade with vanilla (VanillaItem tool x ItemStack material)")
|
||||
void testSmithingTableWithVanillaItemAndItemStack() {
|
||||
InventoryClickEvent event = mockSmithingEvent(vanillaTool.getItem(), new ItemStack(Material.NETHERITE_INGOT));
|
||||
SmithItemEvent event = mockSmithingEvent(vanillaTool.getItem(), new ItemStack(Material.NETHERITE_INGOT));
|
||||
Assertions.assertEquals(Result.DEFAULT, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can't upgrade with SlimefunItem materials (SlimefunItem tool x SlimefunItem material)")
|
||||
@DisplayName("Test that VanillaItems can't upgrade with SlimefunItem materials (VanillaItem tool x SlimefunItem material)")
|
||||
void testSmithingTableWithVanillaItemAndSlimefunItem() {
|
||||
InventoryClickEvent event = mockSmithingEvent(vanillaTool.getItem(), slimefunIngot.getItem());
|
||||
SmithItemEvent event = mockSmithingEvent(vanillaTool.getItem(), slimefunIngot.getItem());
|
||||
Assertions.assertEquals(Result.DENY, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can upgrade with VanillaItems (SlimefunItem tool x VanillaItem material)")
|
||||
@DisplayName("Test that VanillaItems can upgrade with VanillaItems (VanillaItem tool x VanillaItem material)")
|
||||
void testSmithingTableWithVanillaItemAndVanillaItem() {
|
||||
InventoryClickEvent event = mockSmithingEvent(vanillaTool.getItem(), vanillaIngot.getItem());
|
||||
SmithItemEvent event = mockSmithingEvent(vanillaTool.getItem(), vanillaIngot.getItem());
|
||||
Assertions.assertEquals(Result.DEFAULT, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that ItemStacks can be upgraded with SlimefunItem can-be-used-in-workbenches: true")
|
||||
void testCanBeUsedInWorkbenchTrue() {
|
||||
Assertions.assertTrue(usableSlimefunIngot.isUseableInWorkbench());
|
||||
SmithItemEvent event = mockSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), usableSlimefunIngot.getItem());
|
||||
Assertions.assertEquals(Result.DEFAULT, event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that vanilla is unchanged (ItemStack tool x ItemStack material)")
|
||||
void testPrepareSmithingTableWithItemStacks() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), new ItemStack(Material.NETHERITE_INGOT));
|
||||
Assertions.assertNotNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItem material doesn't work (ItemStack tool x SlimefunItem material)")
|
||||
void testPrepareSmithingTableWithItemStackAndSlimefunItem() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), slimefunIngot.getItem());
|
||||
Assertions.assertNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that VanillaItem material works (ItemStack tool x VanillaItem material)")
|
||||
void testPrepareSmithingTableWithItemStackAndVanillaItem() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), vanillaIngot.getItem());
|
||||
Assertions.assertNotNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can upgrade with vanilla (SlimefunItem tool x ItemStack material)")
|
||||
void testPrepareSmithingTableWithSlimefunItemAndItemStack() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(slimefunTool.getItem(), new ItemStack(Material.NETHERITE_INGOT));
|
||||
Assertions.assertNotNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can't upgrade with SlimefunItem materials (SlimefunItem tool x SlimefunItem material)")
|
||||
void testPrepareSmithingTableWithSlimefunItems() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(slimefunTool.getItem(), slimefunIngot.getItem());
|
||||
Assertions.assertNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that SlimefunItems can upgrade with VanillaItems (SlimefunItem tool x VanillaItem material)")
|
||||
void testPrepareSmithingTableWithSlimefunItemAndVanillaItem() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(slimefunTool.getItem(), vanillaIngot.getItem());
|
||||
Assertions.assertNotNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that VanillaItems can upgrade with vanilla (VanillaItem tool x ItemStack material)")
|
||||
void testPrepareSmithingTableWithVanillaItemAndItemStack() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(vanillaTool.getItem(), new ItemStack(Material.NETHERITE_INGOT));
|
||||
Assertions.assertNotNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that VanillaItems can't upgrade with SlimefunItem materials (VanillaItem tool x SlimefunItem material)")
|
||||
void testPrepareSmithingTableWithVanillaItemAndSlimefunItem() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(vanillaTool.getItem(), slimefunIngot.getItem());
|
||||
Assertions.assertNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that VanillaItems can upgrade with VanillaItems (VanillaItem tool x VanillaItem material)")
|
||||
void testPrepareSmithingTableWithVanillaItemAndVanillaItem() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(vanillaTool.getItem(), vanillaIngot.getItem());
|
||||
Assertions.assertNotNull(event.getResult());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Test that ItemStacks can be upgraded with SlimefunItem can-be-used-in-workbenches: true")
|
||||
void testPrepareCanBeUsedInWorkbenchTrue() {
|
||||
PrepareSmithingEvent event = mockPrepareSmithingEvent(new ItemStack(Material.DIAMOND_SWORD), usableSlimefunIngot.getItem());
|
||||
Assertions.assertNotNull(event.getResult());
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user