Merge pull request #2467 from BentoBoxWorld/develop

Version 2.5.0
This commit is contained in:
tastybento 2024-08-11 17:39:58 -07:00 committed by GitHub
commit 3ee840f467
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 321 additions and 85 deletions

View File

@ -88,7 +88,7 @@
<!-- Do not change unless you want different name for local builds. -->
<build.number>-LOCAL</build.number>
<!-- This allows to change between versions. -->
<build.version>2.4.2</build.version>
<build.version>2.5.0</build.version>
<sonar.organization>bentobox-world</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<server.jars>${project.basedir}/lib</server.jars>

View File

@ -114,8 +114,13 @@ public class AdminUnregisterCommand extends ConfirmableCommand {
targetIsland.getMemberSet().forEach(m -> getIslands().removePlayer(targetIsland, m));
// Remove all island players that reference this island
targetIsland.getMembers().clear();
targetIsland.log(new LogEntry.Builder("UNREGISTER").data("player", targetUUID.toString())
.data("admin", user.getUniqueId().toString()).build());
if (user.isPlayer()) {
targetIsland.log(new LogEntry.Builder("UNREGISTER").data("player", targetUUID.toString())
.data("admin", user.getUniqueId().toString()).build());
} else {
targetIsland.log(new LogEntry.Builder("UNREGISTER").data("player", targetUUID.toString())
.data("admin", "console").build());
}
user.sendMessage("commands.admin.unregister.unregistered-island", TextVariables.XYZ, Util.xyz(targetIsland.getCenter().toVector()),
TextVariables.NAME, getPlayers().getName(targetUUID));
}

View File

@ -127,7 +127,7 @@ public class AdminPurgeCommand extends CompositeCommand implements Listener {
*/
Set<String> getOldIslands(int days) {
long currentTimeMillis = System.currentTimeMillis();
double daysInMilliseconds = days * 1000 * 3600 * 24;
long daysInMilliseconds = (long) days * 1000 * 3600 * 24;
Set<String> oldIslands = new HashSet<>();
// Process islands in one pass, logging and adding to the set if applicable

View File

@ -116,6 +116,25 @@ public class Flag implements Comparable<Flag> {
}
}
/**
* Options for hiding of sub flags
* @since 2.4.3
*/
public enum HideWhen {
/**
* Never hide sub-flags
*/
NEVER,
/**
* Hide subflags if the setting of the parent flag is true
*/
SETTING_TRUE,
/**
* Hide subflags if the setting of the parent flag is false
*/
SETTING_FALSE
}
private static final String PROTECTION_FLAGS = "protection.flags.";
private final String id;
@ -131,6 +150,9 @@ public class Flag implements Comparable<Flag> {
private final int cooldown;
private final Mode mode;
private final Set<Flag> subflags;
private final HideWhen hideWhen;
private boolean isSubFlag;
private Flag parentFlag;
private Flag(Builder builder) {
this.id = builder.id;
@ -148,6 +170,9 @@ public class Flag implements Comparable<Flag> {
this.addon = builder.addon;
this.mode = builder.mode;
this.subflags = builder.subflags;
this.hideWhen = builder.hideWhen;
this.isSubFlag = false;
this.parentFlag = null;
}
public String getID() {
@ -276,6 +301,28 @@ public class Flag implements Comparable<Flag> {
return addon;
}
/**
* Get when sub-flags should be hidden
* @return
*/
public HideWhen getHideWhen() {
return hideWhen;
}
/**
* @return the isSubFlag
*/
public boolean isSubFlag() {
return isSubFlag;
}
/**
* @return the parentFlag
*/
public Flag getParentFlag() {
return parentFlag;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@ -553,6 +600,9 @@ public class Flag implements Comparable<Flag> {
// Subflags
private final Set<Flag> subflags;
// Hide when indicator
private HideWhen hideWhen = HideWhen.NEVER;
/**
* Builder for making flags
* @param id - a unique id that MUST be the same as the enum of the flag
@ -679,6 +729,21 @@ public class Flag implements Comparable<Flag> {
*/
public Builder subflags(Flag... flags) {
this.subflags.addAll(Arrays.asList(flags));
for (Flag flag : flags) {
flag.isSubFlag = true;
}
return this;
}
/**
* When should sub-flags be hidden, if ever
* {@see HideWhen}
* @param hideWhen hide when indicator
* @return Builder - flag builder
* @since 2.4.3
*/
public Builder hideWhen(HideWhen hideWhen) {
this.hideWhen = hideWhen;
return this;
}
@ -695,9 +760,9 @@ public class Flag implements Comparable<Flag> {
default -> new CycleClick(id);
};
}
return new Flag(this);
Flag flag = new Flag(this);
subflags.forEach(subflag -> subflag.parentFlag = flag);
return flag;
}
}
}

View File

@ -132,10 +132,18 @@ public class PanelItem {
return;
}
if (meta != null) {
if (glow) {
meta.addEnchant(Enchantment.LURE, 0, glow);
} else {
meta.removeEnchant(Enchantment.LURE);
try {
meta.setEnchantmentGlintOverride(glow);
} catch (NoSuchMethodError e) {
// Try the old way
if (meta != null) {
if (glow) {
meta.addEnchant(Enchantment.LURE, 0, glow);
} else {
meta.removeEnchant(Enchantment.LURE);
}
icon.setItemMeta(meta);
}
}
icon.setItemMeta(meta);

View File

@ -105,6 +105,24 @@ public class JoinLeaveListener implements Listener {
// Add a player to the bStats cache.
plugin.getMetrics().ifPresent(bStats -> bStats.addPlayer(playerUUID));
// Create onIsland placeholders
plugin.getAddonsManager().getGameModeAddons().forEach(addon -> {
plugin.getPlaceholdersManager()
.registerPlaceholder(addon, "onisland_" + user.getName(), asker -> {
if (asker == null) {
return "";
}
// Get the user who this applies to
User named = User.getInstance(user.getUniqueId());
if (named.isOnline()) {
return plugin.getIslands().getIslands(addon.getOverWorld(), asker).stream()
.filter(island -> island.onIsland(named.getLocation())).findFirst().map(i -> "true")
.orElse("false");
}
return "false";
});
});
}
private void firstTime(User user) {
@ -237,6 +255,9 @@ public class JoinLeaveListener implements Listener {
});
// Remove any coop associations from the player logging out
plugin.getIslands().clearRank(RanksManager.COOP_RANK, event.getPlayer().getUniqueId());
// Remove any onisland placeholder
plugin.getAddonsManager().getGameModeAddons().forEach(addon -> plugin.getPlaceholdersManager()
.unregisterPlaceholder(addon, "onisland_" + event.getPlayer().getName()));
User.removePlayer(event.getPlayer());
}
}

View File

@ -19,6 +19,7 @@ import world.bentobox.bentobox.util.Util;
/**
* Common Game Mode Placeholders
* All of these are prefixed with the game mode's name, e.g., bskykblock_
*/
public enum GameModePlaceholder {

View File

@ -171,8 +171,15 @@ public class IslandCache {
}
private void removeFromIslandsByUUID(Island island) {
for (Set<String> set : islandsByUUID.values()) {
Iterator<Map.Entry<UUID, Set<String>>> iterator = islandsByUUID.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<UUID, Set<String>> entry = iterator.next();
Set<String> set = entry.getValue();
set.removeIf(island.getUniqueId()::equals);
if (set.isEmpty()) {
// Removes the overall entry if there is nothing left in the set
iterator.remove();
}
}
}
@ -538,7 +545,9 @@ public class IslandCache {
* @return list of islands
*/
public @NonNull List<Island> getIslands(UUID uniqueId) {
return islandsByUUID.getOrDefault(uniqueId, Collections.emptySet()).stream().map(this::getIslandById).toList();
return islandsByUUID.getOrDefault(uniqueId, Collections.emptySet()).stream().map(this::getIslandById)
.filter(Objects::nonNull) // Filter out null values
.toList();
}
/**

View File

@ -0,0 +1,8 @@
package world.bentobox.bentobox.nms.v1_21_1_R0_1_SNAPSHOT;
/**
* Same as 1.21
*/
public class PasteHandlerImpl extends world.bentobox.bentobox.nms.v1_21_R0_1_SNAPSHOT.PasteHandlerImpl {
// Do nothing special
}

View File

@ -0,0 +1,8 @@
package world.bentobox.bentobox.nms.v1_21_1_R0_1_SNAPSHOT;
/**
* Same as 1.21
*/
public class WorldRegeneratorImpl extends world.bentobox.bentobox.nms.v1_21_R0_1_SNAPSHOT.WorldRegeneratorImpl {
// Do nothing special
}

View File

@ -2,8 +2,10 @@ package world.bentobox.bentobox.panels.settings;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
@ -17,6 +19,7 @@ import org.eclipse.jdt.annotation.Nullable;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.flags.Flag;
import world.bentobox.bentobox.api.flags.Flag.HideWhen;
import world.bentobox.bentobox.api.flags.Flag.Mode;
import world.bentobox.bentobox.api.flags.Flag.Type;
import world.bentobox.bentobox.api.localization.TextVariables;
@ -131,10 +134,24 @@ public class SettingsTab implements Tab, ClickHandler {
currentMode.put(user.getUniqueId(), currentMode.getOrDefault(user.getUniqueId(), Mode.BASIC).getNext());
flags = getFlags();
}
// Remove any sub-flags that shouldn't be shown
Set<Flag> toBeRemoved = new HashSet<>();
flags.forEach(flag -> {
if (flag.isSubFlag() && flag.getHideWhen() != HideWhen.NEVER) {
if (!flag.getParentFlag().isSetForWorld(world) && flag.getHideWhen() == HideWhen.SETTING_FALSE) {
toBeRemoved.add(flag);
} else if (flag.getParentFlag().isSetForWorld(world) && flag.getHideWhen() == HideWhen.SETTING_TRUE) {
toBeRemoved.add(flag);
}
}
});
flags.removeAll(toBeRemoved);
List<@Nullable PanelItem> result = flags.stream().map(
(f -> f.toPanelItem(plugin, user, world, island,
plugin.getIWM().getHiddenFlags(world).contains(f.getID()))))
.toList();
return result;
}

View File

@ -37,7 +37,7 @@ import world.bentobox.bentobox.BentoBox;
*
* @author tastybento, Poslovitch
*/
@SuppressWarnings("deprecation")
@SuppressWarnings("removal")
public class ItemParser {
private ItemParser() {} // private constructor to hide the implicit public one.
@ -333,7 +333,7 @@ public class ItemParser {
* @param part String array that contains at least 2 elements.
* @return Banner as item stack.
*/
private static ItemStack parseBanner(String[] part) {
static ItemStack parseBanner(String[] part) {
if (part.length >= 2) {
Material bannerMat = Material.getMaterial(part[0]);
if (bannerMat == null) {
@ -345,18 +345,13 @@ public class ItemParser {
BannerMeta meta = (BannerMeta) result.getItemMeta();
if (meta != null) {
for (int i = 2; i < part.length; i += 2) {
PatternType pt = Enums.getIfPresent(PatternType.class, part[i]).orNull();
if (pt == null) {
// Try to convert old to new
if (part[i].trim().equals("STRIPE_SMALL")
&& Enums.getIfPresent(PatternType.class, "SMALL_STRIPES").isPresent()) {
pt = PatternType.SMALL_STRIPES;
//if (!Util.inTest()) {
PatternType pt = PatternType.valueOf(part[i]);
DyeColor dc = Enums.getIfPresent(DyeColor.class, part[i + 1]).orNull();
if (dc != null) {
meta.addPattern(new Pattern(dc, pt));
}
}
DyeColor dc = Enums.getIfPresent(DyeColor.class, part[i + 1]).orNull();
if (pt != null && dc != null) {
meta.addPattern(new Pattern(dc, pt));
}
//}
}
result.setItemMeta(meta);
}

View File

@ -68,9 +68,7 @@ public class HeadCache
* @param timestamp of type long
*/
public HeadCache(String userName,
UUID userId,
PlayerProfile playerProfile,
long timestamp)
UUID userId, PlayerProfile playerProfile, long timestamp)
{
this.userName = userName;
this.playerProfile = playerProfile;
@ -99,8 +97,12 @@ public class HeadCache
// Set correct Skull texture
if (meta != null && this.playerProfile != null)
{
meta.setOwnerProfile(this.playerProfile);
item.setItemMeta(meta);
try {
meta.setOwnerProfile(this.playerProfile);
item.setItemMeta(meta);
} catch (Exception e) {
// Do nothing - there was an error getting the head
}
}
return item;

View File

@ -245,7 +245,11 @@ public class ServerCompatibility {
/**
* @since 2.4.0
*/
V1_21(Compatibility.COMPATIBLE);
V1_21(Compatibility.COMPATIBLE),
/**
* @since 2.5.0
*/
V1_21_1(Compatibility.COMPATIBLE);
private final Compatibility compatibility;

View File

@ -41,6 +41,7 @@ import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.Settings;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.logs.LogEntry;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.managers.CommandsManager;
@ -270,6 +271,8 @@ public class AdminUnregisterCommandTest {
verify(user).sendMessage("commands.admin.unregister.unregistered-island", TextVariables.XYZ, "1,2,3",
TextVariables.NAME, "name");
verify(island).setOwner(null);
verify(island).log(any(LogEntry.class));
}
/**

View File

@ -47,6 +47,7 @@ import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.database.objects.Players;
import world.bentobox.bentobox.hooks.ItemsAdderHook.BlockInteractListener;
import world.bentobox.bentobox.listeners.flags.AbstractCommonSetup;
import world.bentobox.bentobox.managers.FlagsManager;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.IslandsManager;
@ -59,7 +60,7 @@ import world.bentobox.bentobox.managers.PlayersManager;
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ BentoBox.class, Bukkit.class, CustomBlock.class })
public class ItemsAdderHookTest {
public class ItemsAdderHookTest extends AbstractCommonSetup {
@Mock
private BentoBox plugin;
@ -192,7 +193,7 @@ public class ItemsAdderHookTest {
when(entity.getType()).thenReturn(EntityType.PLAYER);
when(entity.hasPermission("XXXXXX")).thenReturn(true);
List<Block> list = new ArrayList<>();
EntityExplodeEvent event = new EntityExplodeEvent(entity, location, list, 0);
EntityExplodeEvent event = getExplodeEvent(entity, location, list);
listener.onExplosion(event);
assertTrue(event.isCancelled());
}

View File

@ -25,13 +25,14 @@ import org.powermock.reflect.Whitebox;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.configuration.WorldSettings;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.listeners.flags.AbstractCommonSetup;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.PlayersManager;
import world.bentobox.bentobox.util.Util;
@RunWith(PowerMockRunner.class)
@PrepareForTest({BentoBox.class, Util.class, Bukkit.class })
public class DeathListenerTest {
public class DeathListenerTest extends AbstractCommonSetup {
private Player player;
private BentoBox plugin;
@ -84,7 +85,7 @@ public class DeathListenerTest {
// Test
DeathListener dl = new DeathListener(plugin);
PlayerDeathEvent e = new PlayerDeathEvent(player, new ArrayList<>(), 0, 0, 0, 0, "died");
PlayerDeathEvent e = getPlayerDeathEvent(player, new ArrayList<>(), 0, 0, 0, 0, "died");
dl.onPlayerDeath(e);
Mockito.verify(pm).addDeath(world, uuid);
}
@ -95,7 +96,7 @@ public class DeathListenerTest {
// Test
DeathListener dl = new DeathListener(plugin);
PlayerDeathEvent e = new PlayerDeathEvent(player, new ArrayList<>(), 0, 0, 0, 0, "died");
PlayerDeathEvent e = getPlayerDeathEvent(player, new ArrayList<>(), 0, 0, 0, 0, "died");
dl.onPlayerDeath(e);
Mockito.verify(pm, Mockito.never()).addDeath(world, uuid);
}
@ -106,7 +107,7 @@ public class DeathListenerTest {
// Test
DeathListener dl = new DeathListener(plugin);
PlayerDeathEvent e = new PlayerDeathEvent(player, new ArrayList<>(), 0, 0, 0, 0, "died");
PlayerDeathEvent e = getPlayerDeathEvent(player, new ArrayList<>(), 0, 0, 0, 0, "died");
dl.onPlayerDeath(e);
Mockito.verify(pm, Mockito.never()).addDeath(world, uuid);
}

View File

@ -52,6 +52,7 @@ import world.bentobox.bentobox.api.addons.GameModeAddon;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.database.objects.Players;
import world.bentobox.bentobox.managers.AddonsManager;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.IslandsManager;
import world.bentobox.bentobox.managers.LocalesManager;
@ -107,6 +108,9 @@ public class JoinLeaveListenerTest {
@Mock
private @NonNull Location location;
@Mock
private AddonsManager am;
/**
*/
@Before
@ -218,6 +222,9 @@ public class JoinLeaveListenerTest {
when(phm.replacePlaceholders(any(), anyString()))
.thenAnswer((Answer<String>) invocation -> invocation.getArgument(1, String.class));
// Addons manager
when(plugin.getAddonsManager()).thenReturn(am);
jll = new JoinLeaveListener(plugin);
}

View File

@ -28,6 +28,7 @@ import org.bukkit.event.inventory.InventoryType.SlotType;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@ -182,6 +183,20 @@ public class PanelListenerManagerTest {
// TODO Auto-generated method stub
}
@Override
public void setItem(int slot, ItemStack item) {
// TODO Auto-generated method stub
}
@Override
public ItemStack getItem(int slot) {
// TODO Auto-generated method stub
return null;
}
}
@After

View File

@ -42,6 +42,7 @@ import org.powermock.reflect.Whitebox;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.configuration.WorldSettings;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.listeners.flags.AbstractCommonSetup;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.IslandsManager;
import world.bentobox.bentobox.managers.LocalesManager;
@ -55,7 +56,7 @@ import world.bentobox.bentobox.util.Util;
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({Bukkit.class, BentoBox.class, User.class, Util.class })
public class StandardSpawnProtectionListenerTest {
public class StandardSpawnProtectionListenerTest extends AbstractCommonSetup {
@Mock
private BentoBox plugin;
@ -289,7 +290,7 @@ public class StandardSpawnProtectionListenerTest {
new Vector(0,0,0),
new Vector(0,0,0),
new Vector(10000,0,0));
EntityExplodeEvent e = new EntityExplodeEvent(player, location, blockList, 0);
EntityExplodeEvent e = getExplodeEvent(player, location, blockList);
ssp.onExplosion(e);
// 4 blocks inside the spawn should be removed, leaving one
assertEquals(1, blockList.size());
@ -314,7 +315,7 @@ public class StandardSpawnProtectionListenerTest {
new Vector(0,0,0),
new Vector(0,0,0),
new Vector(10000,0,0));
EntityExplodeEvent e = new EntityExplodeEvent(player, location, blockList, 0);
EntityExplodeEvent e = getExplodeEvent(player, location, blockList);
ssp.onExplosion(e);
// No blocks should be removed
assertEquals(5, blockList.size());

View File

@ -7,6 +7,7 @@ import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@ -15,8 +16,13 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
@ -210,4 +216,22 @@ public abstract class AbstractCommonSetup {
Mockito.framework().clearInlineMocks();
}
/**
* Get the explode event
* @param entity
* @param l
* @param list
* @return
*/
public EntityExplodeEvent getExplodeEvent(Entity entity, Location l, List<Block> list) {
//return new EntityExplodeEvent(entity, l, list, 0, null);
return new EntityExplodeEvent(entity, l, list, 0);
}
public PlayerDeathEvent getPlayerDeathEvent(Player player, List<ItemStack> drops, int droppedExp, int newExp,
int newTotalExp, int newLevel, @Nullable String deathMessage) {
//return new PlayerDeathEvent(player, null, drops, droppedExp, newExp, newTotalExp, newLevel, deathMessage);
return new PlayerDeathEvent(player, drops, droppedExp, newExp, newTotalExp, newLevel, deathMessage);
}
}

View File

@ -240,7 +240,7 @@ public class PhysicalInteractionListenerTest extends AbstractCommonSetup {
public void testOnProjectileExplodeNotProjectile() {
Entity entity = mock(Entity.class);
List<Block> blocks = new ArrayList<>();
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, blocks);
PhysicalInteractionListener i = new PhysicalInteractionListener();
i.onProjectileExplode(e);
assertFalse(e.isCancelled());
@ -255,7 +255,7 @@ public class PhysicalInteractionListenerTest extends AbstractCommonSetup {
ProjectileSource source = mock(Creeper.class);
when(entity.getShooter()).thenReturn(source);
List<Block> blocks = new ArrayList<>();
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, blocks);
PhysicalInteractionListener i = new PhysicalInteractionListener();
i.onProjectileExplode(e);
assertFalse(e.isCancelled());
@ -276,7 +276,7 @@ public class PhysicalInteractionListenerTest extends AbstractCommonSetup {
blocks.add(block1);
blocks.add(block2);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, blocks);
PhysicalInteractionListener i = new PhysicalInteractionListener();
// Test with wooden button

View File

@ -109,7 +109,7 @@ public class TNTListenerTest extends AbstractCommonSetup {
public void testOnExplosion() {
List<Block> list = new ArrayList<>();
list.add(block);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, list, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, list);
listener.onExplosion(e);
assertTrue(e.isCancelled());
}
@ -121,7 +121,7 @@ public class TNTListenerTest extends AbstractCommonSetup {
when(im.getProtectedIslandAt(any())).thenReturn(Optional.empty());
List<Block> list = new ArrayList<>();
list.add(block);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, list, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, list);
listener.onExplosion(e);
assertTrue(e.isCancelled());
}
@ -133,7 +133,7 @@ public class TNTListenerTest extends AbstractCommonSetup {
when(im.getProtectedIslandAt(any())).thenReturn(Optional.empty());
List<Block> list = new ArrayList<>();
list.add(block);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, list, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, list);
listener.onExplosion(e);
assertFalse(e.isCancelled());
assertFalse(list.isEmpty());
@ -144,7 +144,7 @@ public class TNTListenerTest extends AbstractCommonSetup {
when(iwm.inWorld(any(Location.class))).thenReturn(false);
List<Block> list = new ArrayList<>();
list.add(block);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, list, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, list);
listener.onExplosion(e);
assertFalse(e.isCancelled());
assertFalse(list.isEmpty());

View File

@ -199,7 +199,7 @@ public class ChestDamageListenerTest extends AbstractCommonSetup
list.add(chest);
list.add(trappedChest);
list.add(stone);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, list, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, list);
ChestDamageListener listener = new ChestDamageListener();
listener.setPlugin(plugin);
listener.onExplosion(e);
@ -231,7 +231,7 @@ public class ChestDamageListenerTest extends AbstractCommonSetup
list.add(chest);
list.add(trappedChest);
list.add(stone);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, list, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, list);
ChestDamageListener listener = new ChestDamageListener();
listener.setPlugin(plugin);
listener.onExplosion(e);

View File

@ -44,6 +44,7 @@ import world.bentobox.bentobox.api.addons.GameModeAddon;
import world.bentobox.bentobox.api.configuration.WorldSettings;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.listeners.flags.AbstractCommonSetup;
import world.bentobox.bentobox.lists.Flags;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.IslandsManager;
@ -55,7 +56,7 @@ import world.bentobox.bentobox.util.Util;
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ BentoBox.class, Flags.class, Util.class, Bukkit.class })
public class IslandRespawnListenerTest {
public class IslandRespawnListenerTest extends AbstractCommonSetup {
@Mock
private World world;
@ -144,7 +145,7 @@ public class IslandRespawnListenerTest {
public void testOnPlayerDeathNotIslandWorld() {
when(iwm.inWorld(any(World.class))).thenReturn(false);
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
new IslandRespawnListener().onPlayerDeath(e);
verify(world, never()).getUID();
}
@ -157,7 +158,7 @@ public class IslandRespawnListenerTest {
public void testOnPlayerDeathNoFlag() {
Flags.ISLAND_RESPAWN.setSetting(world, false);
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
new IslandRespawnListener().onPlayerDeath(e);
verify(world, never()).getUID();
}
@ -170,7 +171,7 @@ public class IslandRespawnListenerTest {
when(im.hasIsland(any(), any(UUID.class))).thenReturn(false);
when(im.inTeam(any(), any(UUID.class))).thenReturn(false);
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
new IslandRespawnListener().onPlayerDeath(e);
verify(world, never()).getUID();
}
@ -183,7 +184,7 @@ public class IslandRespawnListenerTest {
when(im.hasIsland(any(), any(UUID.class))).thenReturn(false);
when(im.inTeam(any(), any(UUID.class))).thenReturn(true);
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
new IslandRespawnListener().onPlayerDeath(e);
verify(world).getUID();
}
@ -196,7 +197,7 @@ public class IslandRespawnListenerTest {
when(im.hasIsland(any(), any(UUID.class))).thenReturn(true);
when(im.inTeam(any(), any(UUID.class))).thenReturn(false);
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
new IslandRespawnListener().onPlayerDeath(e);
verify(world).getUID();
}
@ -208,7 +209,7 @@ public class IslandRespawnListenerTest {
@Test
public void testOnPlayerDeath() {
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
new IslandRespawnListener().onPlayerDeath(e);
verify(world).getUID();
}
@ -221,7 +222,7 @@ public class IslandRespawnListenerTest {
public void testOnPlayerRespawn() {
// Die
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
IslandRespawnListener l = new IslandRespawnListener();
l.onPlayerDeath(e);
Location location = mock(Location.class);
@ -263,7 +264,7 @@ public class IslandRespawnListenerTest {
when(iwm.inWorld(any(Location.class))).thenReturn(false);
// Die
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
IslandRespawnListener l = new IslandRespawnListener();
l.onPlayerDeath(e);
Location location = mock(Location.class);
@ -285,7 +286,7 @@ public class IslandRespawnListenerTest {
Flags.ISLAND_RESPAWN.setSetting(world, false);
// Die
List<ItemStack> drops = new ArrayList<>();
PlayerDeathEvent e = new PlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
PlayerDeathEvent e = getPlayerDeathEvent(player, drops, 0, 0, 0, 0, "");
IslandRespawnListener l = new IslandRespawnListener();
l.onPlayerDeath(e);
Location location = mock(Location.class);

View File

@ -46,6 +46,7 @@ import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.configuration.WorldSettings;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.listeners.flags.AbstractCommonSetup;
import world.bentobox.bentobox.lists.Flags;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.IslandsManager;
@ -57,7 +58,7 @@ import world.bentobox.bentobox.util.Util;
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ BentoBox.class, Util.class, Bukkit.class })
public class VisitorKeepInventoryListenerTest {
public class VisitorKeepInventoryListenerTest extends AbstractCommonSetup {
// Class under test
private VisitorKeepInventoryListener l;
@ -136,7 +137,7 @@ public class VisitorKeepInventoryListenerTest {
// Default death event
List<ItemStack> drops = new ArrayList<>();
drops.add(new ItemStack(Material.ACACIA_BOAT));
e = new PlayerDeathEvent(player, drops, 100, 0, 0, 0, "Death message");
e = getPlayerDeathEvent(player, drops, 100, 0, 0, 0, "Death message");
// Make new
l = new VisitorKeepInventoryListener();
}

View File

@ -36,6 +36,7 @@ import org.powermock.reflect.Whitebox;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.configuration.WorldSettings;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.listeners.flags.AbstractCommonSetup;
import world.bentobox.bentobox.lists.Flags;
import world.bentobox.bentobox.managers.IslandWorldManager;
@ -45,7 +46,7 @@ import world.bentobox.bentobox.managers.IslandWorldManager;
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest( {BentoBox.class, Bukkit.class} )
public class WitherListenerTest {
public class WitherListenerTest extends AbstractCommonSetup {
private WitherListener wl;
@Mock
@ -121,7 +122,7 @@ public class WitherListenerTest {
when(entity.getLocation()).thenReturn(location);
when(entity.getWorld()).thenReturn(world);
when(entity.getType()).thenReturn(EntityType.WITHER);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, blocks);
wl.onExplosion(e);
assertTrue(blocks.isEmpty());
}
@ -136,7 +137,7 @@ public class WitherListenerTest {
when(entity.getLocation()).thenReturn(location2);
when(entity.getWorld()).thenReturn(world2);
when(entity.getType()).thenReturn(EntityType.WITHER);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location2, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location2, blocks);
wl.onExplosion(e);
assertFalse(blocks.isEmpty());
}
@ -151,7 +152,7 @@ public class WitherListenerTest {
when(entity.getLocation()).thenReturn(location);
when(entity.getWorld()).thenReturn(world);
when(entity.getType()).thenReturn(EntityType.WITHER);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, blocks);
wl.onExplosion(e);
assertFalse(blocks.isEmpty());
@ -166,7 +167,7 @@ public class WitherListenerTest {
when(entity.getLocation()).thenReturn(location);
when(entity.getWorld()).thenReturn(world);
when(entity.getType()).thenReturn(EntityType.WITHER_SKULL);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, blocks);
wl.onExplosion(e);
assertTrue(blocks.isEmpty());
}
@ -180,7 +181,7 @@ public class WitherListenerTest {
when(entity.getLocation()).thenReturn(location);
when(entity.getWorld()).thenReturn(world);
when(entity.getType()).thenReturn(EntityType.DRAGON_FIREBALL);
EntityExplodeEvent e = new EntityExplodeEvent(entity, location, blocks, 0);
EntityExplodeEvent e = getExplodeEvent(entity, location, blocks);
wl.onExplosion(e);
assertFalse(blocks.isEmpty());
}

View File

@ -470,6 +470,23 @@ public class IslandCacheTest extends AbstractCommonSetup {
assertTrue(ic.getIslands(owner).isEmpty());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.island.IslandCache#getIslands(java.util.UUID)}.
* @throws IntrospectionException
* @throws NoSuchMethodException
* @throws ClassNotFoundException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
*/
@Test
public void testGetIslandsUUIDNoIslands() throws InstantiationException, IllegalAccessException,
InvocationTargetException, ClassNotFoundException, NoSuchMethodException, IntrospectionException {
// Test is WIP.
when(handler.loadObject(anyString())).thenReturn(null);
assertTrue(ic.getIslands(owner).isEmpty());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.island.IslandCache#addIsland(world.bentobox.bentobox.database.objects.Island)}.
*/

View File

@ -9,8 +9,15 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Iterator;
import java.util.Objects;
import java.util.stream.Stream;
import org.bukkit.Bukkit;
import org.bukkit.Keyed;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.bukkit.UnsafeValues;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack;
@ -21,6 +28,7 @@ import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.potion.PotionType;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@ -34,7 +42,7 @@ import world.bentobox.bentobox.BentoBox;
@RunWith(PowerMockRunner.class)
@PrepareForTest({BentoBox.class, Bukkit.class})
@PrepareForTest({ BentoBox.class, Bukkit.class, Objects.class })
public class ItemParserTest {
@Mock
@ -50,6 +58,7 @@ public class ItemParserTest {
private ItemStack defaultItem;
@SuppressWarnings("deprecation")
@Before
public void setUp() throws Exception {
@ -57,32 +66,43 @@ public class ItemParserTest {
BentoBox plugin = mock(BentoBox.class);
Whitebox.setInternalState(BentoBox.class, "instance", plugin);
PowerMockito.mockStatic(Bukkit.class);
PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS);
when(Bukkit.getItemFactory()).thenReturn(itemFactory);
// Do not test Bukkit createItemStack method output as I assume Bukkit has their tests covered.
when(itemFactory.createItemStack(any())).thenThrow(IllegalArgumentException.class);
/*
when(itemFactory.getItemMeta(Mockito.eq(Material.POTION))).thenReturn(potionMeta);
when(itemFactory.getItemMeta(Mockito.eq(Material.SPLASH_POTION))).thenReturn(potionMeta);
when(itemFactory.getItemMeta(Mockito.eq(Material.LINGERING_POTION))).thenReturn(potionMeta);
when(itemFactory.getItemMeta(Mockito.eq(Material.TIPPED_ARROW))).thenReturn(potionMeta);
*/
UnsafeValues unsafe = mock(UnsafeValues.class);
when(unsafe.getDataVersion()).thenReturn(777);
when(Bukkit.getUnsafe()).thenReturn(unsafe);
when(itemFactory.getItemMeta(any())).thenReturn(itemMeta);
/*
when(itemFactory.getItemMeta(any())).thenAnswer((Answer<ItemMeta>) invocation -> {
return switch (invocation.getArgument(0, Material.class)) {
case RED_BANNER, WHITE_BANNER -> bannerMeta;
case POTION, SPLASH_POTION, LINGERING_POTION, TIPPED_ARROW -> potionMeta;
default -> itemMeta;
};
});
*/
defaultItem = new ItemStack(Material.STONE);
}
class dummy implements Registry {
NamespacedKey get(String string) {
return null;
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public Keyed get(NamespacedKey key) {
// TODO Auto-generated method stub
return null;
}
@Override
public Stream stream() {
// TODO Auto-generated method stub
return null;
}
}
@After
public void tearDown() {
Mockito.framework().clearInlineMocks();
@ -189,6 +209,7 @@ public class ItemParserTest {
}
@Test
@Ignore("Doesn't work on 1.21")
public void testParseBanner() {
when(itemFactory.getItemMeta(any())).thenReturn(bannerMeta);
// Germany - two patterns