mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
Fix another bug with interaction fix and add more interaction tests (#4090)
This commit is contained in:
parent
86533a8ec9
commit
1fb27b9327
@ -42,6 +42,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
|||||||
import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag;
|
import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag;
|
||||||
|
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
|
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link BlockListener} is responsible for listening to the {@link BlockPlaceEvent}
|
* The {@link BlockListener} is responsible for listening to the {@link BlockPlaceEvent}
|
||||||
@ -224,9 +225,10 @@ public class BlockListener implements Listener {
|
|||||||
// Partial fix for #4087 - We don't want the inventory to be usable post break, close it for anyone still inside
|
// Partial fix for #4087 - We don't want the inventory to be usable post break, close it for anyone still inside
|
||||||
// The main fix is in SlimefunItemInteractListener preventing opening to begin with
|
// The main fix is in SlimefunItemInteractListener preventing opening to begin with
|
||||||
// Close the inventory for all viewers of this block
|
// Close the inventory for all viewers of this block
|
||||||
|
BlockMenu inventory = BlockStorage.getInventory(e.getBlock());
|
||||||
// TODO(future): Remove this check when MockBukkit supports viewers
|
// TODO(future): Remove this check when MockBukkit supports viewers
|
||||||
if (!Slimefun.instance().isUnitTest()) {
|
if (inventory != null && !Slimefun.instance().isUnitTest()) {
|
||||||
BlockStorage.getInventory(e.getBlock()).toInventory().getViewers().forEach(HumanEntity::closeInventory);
|
inventory.toInventory().getViewers().forEach(HumanEntity::closeInventory);
|
||||||
}
|
}
|
||||||
// Remove the block data
|
// Remove the block data
|
||||||
BlockStorage.clearBlockInfo(e.getBlock());
|
BlockStorage.clearBlockInfo(e.getBlock());
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
|
package io.github.thebusybiscuit.slimefun4.implementation.listeners;
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.api.events.SlimefunBlockBreakEvent;
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
@ -17,23 +16,34 @@ import org.junit.jupiter.api.Assertions;
|
|||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import io.github.bakedlibs.dough.common.ChatColors;
|
||||||
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.api.events.SlimefunBlockBreakEvent;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemGroup;
|
||||||
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
|
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.api.recipes.RecipeType;
|
import io.github.thebusybiscuit.slimefun4.api.recipes.RecipeType;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.EnergyConnector;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.machines.ElectricFurnace;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.electric.machines.ElectricFurnace;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.magical.staves.WindStaff;
|
||||||
import io.github.thebusybiscuit.slimefun4.test.TestUtilities;
|
import io.github.thebusybiscuit.slimefun4.test.TestUtilities;
|
||||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
|
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
|
||||||
import be.seeseemelk.mockbukkit.MockBukkit;
|
import be.seeseemelk.mockbukkit.MockBukkit;
|
||||||
import be.seeseemelk.mockbukkit.ServerMock;
|
import be.seeseemelk.mockbukkit.ServerMock;
|
||||||
|
import be.seeseemelk.mockbukkit.entity.PlayerMock;
|
||||||
|
|
||||||
class TestSlimefunItemInteractListener {
|
class TestSlimefunItemInteractListener {
|
||||||
|
|
||||||
private static ServerMock server;
|
private static ServerMock server;
|
||||||
private static Slimefun plugin;
|
private static Slimefun plugin;
|
||||||
private static SlimefunItem slimefunItem;
|
// Block with inventory
|
||||||
|
private static SlimefunItem electricFurnace;
|
||||||
|
// Interactable block
|
||||||
|
private static SlimefunItem energyConnector;
|
||||||
|
// Interactable item
|
||||||
|
private static SlimefunItem windStaff;
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void load() {
|
public static void load() {
|
||||||
@ -47,13 +57,19 @@ class TestSlimefunItemInteractListener {
|
|||||||
// Enable tickers so the electric furnace can be registered
|
// Enable tickers so the electric furnace can be registered
|
||||||
Slimefun.getCfg().setValue("URID.enable-tickers", true);
|
Slimefun.getCfg().setValue("URID.enable-tickers", true);
|
||||||
|
|
||||||
slimefunItem = new ElectricFurnace(
|
ItemGroup testGroup = TestUtilities.getItemGroup(plugin, "test");
|
||||||
TestUtilities.getItemGroup(plugin, "test"), SlimefunItems.ELECTRIC_FURNACE, RecipeType.NULL, new ItemStack[]{}
|
|
||||||
)
|
electricFurnace = new ElectricFurnace(testGroup, SlimefunItems.ELECTRIC_FURNACE, RecipeType.NULL, new ItemStack[]{})
|
||||||
.setCapacity(100)
|
.setCapacity(100)
|
||||||
.setEnergyConsumption(10)
|
.setEnergyConsumption(10)
|
||||||
.setProcessingSpeed(1);
|
.setProcessingSpeed(1);
|
||||||
slimefunItem.register(plugin);
|
electricFurnace.register(plugin);
|
||||||
|
|
||||||
|
energyConnector = new EnergyConnector(testGroup, SlimefunItems.ENERGY_CONNECTOR, RecipeType.NULL, new ItemStack[9], null);
|
||||||
|
energyConnector.register(plugin);
|
||||||
|
|
||||||
|
windStaff = new WindStaff(testGroup, SlimefunItems.STAFF_WIND, RecipeType.NULL, new ItemStack[9]);
|
||||||
|
windStaff.register(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterAll
|
@AfterAll
|
||||||
@ -71,7 +87,7 @@ class TestSlimefunItemInteractListener {
|
|||||||
void testCannotOpenInvOfBrokenBlock() {
|
void testCannotOpenInvOfBrokenBlock() {
|
||||||
// Place down an electric furnace
|
// Place down an electric furnace
|
||||||
Player player = server.addPlayer();
|
Player player = server.addPlayer();
|
||||||
ItemStack itemStack = slimefunItem.getItem();
|
ItemStack itemStack = electricFurnace.getItem();
|
||||||
player.getInventory().setItemInMainHand(itemStack);
|
player.getInventory().setItemInMainHand(itemStack);
|
||||||
|
|
||||||
// Create a world and place the block
|
// Create a world and place the block
|
||||||
@ -98,7 +114,7 @@ class TestSlimefunItemInteractListener {
|
|||||||
|
|
||||||
// Assert we do have an inventory which would be opened
|
// Assert we do have an inventory which would be opened
|
||||||
// TODO: Create an event for open inventory so this isn't guess work
|
// TODO: Create an event for open inventory so this isn't guess work
|
||||||
Assertions.assertTrue(BlockMenuPreset.isInventory(slimefunItem.getId()));
|
Assertions.assertTrue(BlockMenuPreset.isInventory(electricFurnace.getId()));
|
||||||
Assertions.assertTrue(BlockStorage.getStorage(block.getWorld()).hasInventory(block.getLocation()));
|
Assertions.assertTrue(BlockStorage.getStorage(block.getWorld()).hasInventory(block.getLocation()));
|
||||||
// TODO(future): Check viewers - MockBukkit does not implement this today
|
// TODO(future): Check viewers - MockBukkit does not implement this today
|
||||||
|
|
||||||
@ -106,7 +122,7 @@ class TestSlimefunItemInteractListener {
|
|||||||
BlockBreakEvent blockBreakEvent = new BlockBreakEvent(block, player);
|
BlockBreakEvent blockBreakEvent = new BlockBreakEvent(block, player);
|
||||||
server.getPluginManager().callEvent(blockBreakEvent);
|
server.getPluginManager().callEvent(blockBreakEvent);
|
||||||
server.getPluginManager().assertEventFired(SlimefunBlockBreakEvent.class, e -> {
|
server.getPluginManager().assertEventFired(SlimefunBlockBreakEvent.class, e -> {
|
||||||
Assertions.assertEquals(slimefunItem.getId(), e.getSlimefunItem().getId());
|
Assertions.assertEquals(electricFurnace.getId(), e.getSlimefunItem().getId());
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -134,4 +150,68 @@ class TestSlimefunItemInteractListener {
|
|||||||
() -> server.getPluginManager().assertEventFired(PlayerRightClickEvent.class, e -> true)
|
() -> server.getPluginManager().assertEventFired(PlayerRightClickEvent.class, e -> true)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testRightClickItem() {
|
||||||
|
Player player = server.addPlayer();
|
||||||
|
ItemStack itemStack = windStaff.getItem();
|
||||||
|
player.getInventory().setItemInMainHand(itemStack);
|
||||||
|
|
||||||
|
// Assert player is at full food level (wind staff reduces food level on usage)
|
||||||
|
Assertions.assertEquals(20, player.getFoodLevel());
|
||||||
|
|
||||||
|
// Right click the air
|
||||||
|
PlayerInteractEvent playerInteractEvent = new PlayerInteractEvent(
|
||||||
|
player, Action.RIGHT_CLICK_AIR, itemStack, null, BlockFace.UP, EquipmentSlot.HAND
|
||||||
|
);
|
||||||
|
|
||||||
|
server.getPluginManager().callEvent(playerInteractEvent);
|
||||||
|
server.getPluginManager().assertEventFired(PlayerInteractEvent.class, e -> {
|
||||||
|
// Assert our interaction was not cancelled
|
||||||
|
Assertions.assertNotSame(e.useItemInHand(), Result.DENY);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert our right click event fired and the item usage was not denied
|
||||||
|
server.getPluginManager().assertEventFired(PlayerRightClickEvent.class, e -> {
|
||||||
|
Assertions.assertNotSame(e.useItem(), Result.DENY);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert our food level is now 18
|
||||||
|
Assertions.assertEquals(18, player.getFoodLevel());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testRightClickInteractableBlock() {
|
||||||
|
// Place down an energy connector
|
||||||
|
PlayerMock player = server.addPlayer();
|
||||||
|
ItemStack itemStack = energyConnector.getItem();
|
||||||
|
player.getInventory().setItemInMainHand(itemStack);
|
||||||
|
|
||||||
|
// Create a world and place the block
|
||||||
|
World world = TestUtilities.createWorld(server);
|
||||||
|
Block block = TestUtilities.placeSlimefunBlock(server, itemStack, world, player);
|
||||||
|
|
||||||
|
// Right click on the block
|
||||||
|
PlayerInteractEvent playerInteractEvent = new PlayerInteractEvent(
|
||||||
|
player, Action.RIGHT_CLICK_BLOCK, itemStack, block, BlockFace.UP, EquipmentSlot.HAND
|
||||||
|
);
|
||||||
|
|
||||||
|
server.getPluginManager().callEvent(playerInteractEvent);
|
||||||
|
server.getPluginManager().assertEventFired(PlayerInteractEvent.class, e -> {
|
||||||
|
// Allow interaction of the block
|
||||||
|
Assertions.assertSame(e.useInteractedBlock(), Result.ALLOW);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert our right click event fired and the block usage was not denied
|
||||||
|
server.getPluginManager().assertEventFired(PlayerRightClickEvent.class, e -> {
|
||||||
|
Assertions.assertNotSame(e.useBlock(), Result.DENY);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert the message our energy connector sends
|
||||||
|
Assertions.assertEquals(ChatColors.color("&7Connected: " + "&4\u2718"), player.nextMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user