diff --git a/README.md b/README.md
index 9da305c89..b8c6d63bd 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,7 @@ And these include some of the official Addons that are bringing incredible new f
* [**MagicCobblestoneGenerator**](https://github.com/BentoBoxWorld/MagicCobblestoneGenerator): generates any blocks in cobblestone generators.
* [**IslandFly**](https://github.com/BentoBoxWorld/IslandFly): allows your players to fly on their islands.
* [**Limits**](https://github.com/BentoBoxWorld/addon-limits): limits blocks and entities that your players can place on their islands.
+* [**Greenhouses**](https://github.com/BentoBoxWorld/greenhouses): enables players to make mini biome glass houses on their island.
And there are plenty of other official or community-made Addons you can try and use for your server!
diff --git a/pom.xml b/pom.xml
index f4018ab31..2a2be3bbd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -80,7 +80,7 @@
-LOCAL
- 1.6.0
+ 1.7.0
diff --git a/src/main/java/world/bentobox/bentobox/BStats.java b/src/main/java/world/bentobox/bentobox/BStats.java
index 8eb13c0b8..2c5913d5d 100644
--- a/src/main/java/world/bentobox/bentobox/BStats.java
+++ b/src/main/java/world/bentobox/bentobox/BStats.java
@@ -7,6 +7,7 @@ import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import world.bentobox.bentobox.api.addons.GameModeAddon;
+import world.bentobox.bentobox.api.flags.Flag;
/**
* @author Poslovitch
@@ -42,6 +43,7 @@ public class BStats {
registerGameModeAddonsChart();
registerHooksChart();
registerPlayersPerServerChart();
+ registerFlagsDisplayModeChart();
// Single Line charts
registerIslandsCountChart();
@@ -134,4 +136,25 @@ public class BStats {
else return "201+";
}));
}
+
+ /**
+ * Sends the "flags display mode" of all the online players.
+ * @since 1.6.0
+ */
+ private void registerFlagsDisplayModeChart() {
+ metrics.addCustomChart(new Metrics.AdvancedPie("flagsDisplayMode", () -> {
+ Map values = new HashMap<>();
+
+ Bukkit.getOnlinePlayers().forEach(player -> {
+ Flag.Mode mode = plugin.getPlayers().getFlagsDisplayMode(player.getUniqueId());
+ if (values.containsKey(mode.name())) {
+ values.put(mode.name(), values.get(mode.name()) + 1);
+ } else {
+ values.put(mode.name(), 1);
+ }
+ });
+
+ return values;
+ }));
+ }
}
diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java
index ca84e1b88..9845d9835 100644
--- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java
+++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java
@@ -13,6 +13,11 @@ import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.util.Util;
+/**
+ * Unban command
+ * @author tastybento
+ *
+ */
public class IslandUnbanCommand extends CompositeCommand {
public IslandUnbanCommand(CompositeCommand islandCommand) {
@@ -29,7 +34,7 @@ public class IslandUnbanCommand extends CompositeCommand {
}
@Override
- public boolean execute(User user, String label, List args) {
+ public boolean canExecute(User user, String label, List args) {
if (args.size() != 1) {
// Show help
showHelp(this, user);
@@ -63,12 +68,13 @@ public class IslandUnbanCommand extends CompositeCommand {
return false;
}
// Finished error checking - start the unbanning
- User targetUser = User.getInstance(targetUUID);
- return unban(user, targetUser);
+ return true;
}
- private boolean unban(User issuer, User target) {
- Island island = getIslands().getIsland(getWorld(), issuer.getUniqueId());
+ @Override
+ public boolean execute(User user, String label, List args) {
+ User target = User.getInstance(getPlayers().getUUID(args.get(0)));
+ Island island = getIslands().getIsland(getWorld(), user.getUniqueId());
// Run the event
IslandBaseEvent unbanEvent = IslandEvent.builder()
@@ -79,9 +85,9 @@ public class IslandUnbanCommand extends CompositeCommand {
.build();
// Event is not cancelled
- if (!unbanEvent.isCancelled() && island.unban(issuer.getUniqueId(), target.getUniqueId())) {
- issuer.sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, target.getName());
- target.sendMessage("commands.island.unban.you-are-unbanned", TextVariables.NAME, issuer.getName());
+ if (!unbanEvent.isCancelled() && island.unban(user.getUniqueId(), target.getUniqueId())) {
+ user.sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, target.getName());
+ target.sendMessage("commands.island.unban.you-are-unbanned", TextVariables.NAME, user.getName());
// Set cooldown
if (getSettings().getBanCooldown() > 0 && getParent() != null) {
getParent().getSubCommand("ban").ifPresent(subCommand ->
diff --git a/src/main/java/world/bentobox/bentobox/api/events/PremadeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/PremadeEvent.java
deleted file mode 100644
index a64097096..000000000
--- a/src/main/java/world/bentobox/bentobox/api/events/PremadeEvent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package world.bentobox.bentobox.api.events;
-
-import org.bukkit.event.Event;
-
-/**
- * Provides the default methods expected when extending {@link Event}.
- * @deprecated As of 1.5.3, for removal. Use {@link BentoBoxEvent} instead.
- */
-@Deprecated
-public abstract class PremadeEvent extends BentoBoxEvent {
-
- /**
- * The default constructor is defined for cleaner code.
- * This constructor assumes the PremadeEvent is synchronous.
- */
- public PremadeEvent() {
- this(false);
- }
-
- /**
- * This constructor is used to explicitly declare an PremadeEvent as synchronous or asynchronous.
- * @param async - true indicates the event will fire asynchronously, false
- * by default from default constructor
- * @since 1.5.2
- */
- public PremadeEvent(boolean async) {
- super(async);
- }
-
-}
diff --git a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagChangeEvent.java
new file mode 100644
index 000000000..0f481ad62
--- /dev/null
+++ b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagChangeEvent.java
@@ -0,0 +1,40 @@
+package world.bentobox.bentobox.api.events.flags;
+
+import world.bentobox.bentobox.api.events.BentoBoxEvent;
+import world.bentobox.bentobox.api.flags.Flag;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author Poslovitch
+ * @since 1.6.0
+ */
+public abstract class FlagChangeEvent extends BentoBoxEvent {
+
+ private final UUID player;
+ private final Flag editedFlag;
+
+ /**
+ * @param player - player changing the flag
+ * @param editedFlag - flag that has changed
+ */
+ public FlagChangeEvent(UUID player, Flag editedFlag) {
+ this.player = player;
+ this.editedFlag = editedFlag;
+ }
+
+ /**
+ * @return the player
+ */
+ public UUID getPlayer() {
+ return player;
+ }
+
+ /**
+ * @return the editedFlag
+ */
+ public Flag getEditedFlag() {
+ return editedFlag;
+ }
+}
diff --git a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java
index ba979da37..0bd2854a8 100644
--- a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java
+++ b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java
@@ -2,7 +2,6 @@ package world.bentobox.bentobox.api.events.flags;
import java.util.UUID;
-import world.bentobox.bentobox.api.events.BentoBoxEvent;
import world.bentobox.bentobox.api.flags.Flag;
import world.bentobox.bentobox.database.objects.Island;
@@ -10,11 +9,9 @@ import world.bentobox.bentobox.database.objects.Island;
* @author tastybento
* @since 1.6.0
*/
-public class FlagProtectionChangeEvent extends BentoBoxEvent {
+public class FlagProtectionChangeEvent extends FlagChangeEvent {
private final Island island;
- private final UUID player;
- private final Flag editedFlag;
private final int setTo;
/**
@@ -25,9 +22,8 @@ public class FlagProtectionChangeEvent extends BentoBoxEvent {
* @param setTo - value it was set to
*/
public FlagProtectionChangeEvent(Island island, UUID player, Flag editedFlag, int setTo) {
+ super(player, editedFlag);
this.island = island;
- this.player = player;
- this.editedFlag = editedFlag;
this.setTo = setTo;
}
@@ -38,20 +34,6 @@ public class FlagProtectionChangeEvent extends BentoBoxEvent {
return island;
}
- /**
- * @return the player
- */
- public UUID getPlayer() {
- return player;
- }
-
- /**
- * @return the editedFlag
- */
- public Flag getEditedFlag() {
- return editedFlag;
- }
-
/**
* @return the setTo
*/
diff --git a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java
index 1148c926a..9dd31410b 100644
--- a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java
+++ b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java
@@ -2,7 +2,6 @@ package world.bentobox.bentobox.api.events.flags;
import java.util.UUID;
-import world.bentobox.bentobox.api.events.BentoBoxEvent;
import world.bentobox.bentobox.api.flags.Flag;
import world.bentobox.bentobox.database.objects.Island;
@@ -10,11 +9,9 @@ import world.bentobox.bentobox.database.objects.Island;
* @author tastybento
* @since 1.6.0
*/
-public class FlagSettingChangeEvent extends BentoBoxEvent {
+public class FlagSettingChangeEvent extends FlagChangeEvent {
private final Island island;
- private final UUID player;
- private final Flag editedFlag;
private final boolean setTo;
/**
@@ -25,9 +22,8 @@ public class FlagSettingChangeEvent extends BentoBoxEvent {
* @param setTo - value it was set to
*/
public FlagSettingChangeEvent(Island island, UUID player, Flag editedFlag, boolean setTo) {
+ super(player, editedFlag);
this.island = island;
- this.player = player;
- this.editedFlag = editedFlag;
this.setTo = setTo;
}
@@ -38,20 +34,6 @@ public class FlagSettingChangeEvent extends BentoBoxEvent {
return island;
}
- /**
- * @return the player
- */
- public UUID getPlayer() {
- return player;
- }
-
- /**
- * @return the editedFlag
- */
- public Flag getEditedFlag() {
- return editedFlag;
- }
-
/**
* @return the setTo
*/
diff --git a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java
index 086873395..497d9e4a8 100644
--- a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java
+++ b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java
@@ -4,18 +4,15 @@ import java.util.UUID;
import org.bukkit.World;
-import world.bentobox.bentobox.api.events.BentoBoxEvent;
import world.bentobox.bentobox.api.flags.Flag;
/**
* @author tastybento
* @since 1.6.0
*/
-public class FlagWorldSettingChangeEvent extends BentoBoxEvent {
+public class FlagWorldSettingChangeEvent extends FlagChangeEvent {
private final World world;
- private final UUID player;
- private final Flag editedFlag;
private final boolean setTo;
/**
@@ -26,9 +23,8 @@ public class FlagWorldSettingChangeEvent extends BentoBoxEvent {
* @param setTo - value it was set to
*/
public FlagWorldSettingChangeEvent(World world, UUID player, Flag editedFlag, boolean setTo) {
+ super(player, editedFlag);
this.world = world;
- this.player = player;
- this.editedFlag = editedFlag;
this.setTo = setTo;
}
@@ -39,21 +35,6 @@ public class FlagWorldSettingChangeEvent extends BentoBoxEvent {
return world;
}
-
- /**
- * @return the player
- */
- public UUID getPlayer() {
- return player;
- }
-
- /**
- * @return the editedFlag
- */
- public Flag getEditedFlag() {
- return editedFlag;
- }
-
/**
* @return the setTo
*/
diff --git a/src/main/java/world/bentobox/bentobox/api/flags/Flag.java b/src/main/java/world/bentobox/bentobox/api/flags/Flag.java
index 7da1d869b..fc1329a99 100644
--- a/src/main/java/world/bentobox/bentobox/api/flags/Flag.java
+++ b/src/main/java/world/bentobox/bentobox/api/flags/Flag.java
@@ -359,6 +359,7 @@ public class Flag implements Comparable {
* @param invisible - true if this flag is not visible to players
* @return - PanelItem for this flag or null if item is invisible to user
*/
+ @Nullable
public PanelItem toPanelItem(BentoBox plugin, User user, @Nullable Island island, boolean invisible) {
// Invisibility
if (!user.isOp() && invisible) {
diff --git a/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java b/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java
index 877ab2af7..3718dc9ae 100644
--- a/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java
+++ b/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java
@@ -17,4 +17,8 @@ public class TextVariables {
public static final String SPAWN_HERE = "[spawn_here]";
public static final String VERSION = "[version]";
public static final String START_TEXT = "[start]";
+ /**
+ * @since 1.6.0
+ */
+ public static final String NEXT = "[next]";
}
diff --git a/src/main/java/world/bentobox/bentobox/api/panels/Tab.java b/src/main/java/world/bentobox/bentobox/api/panels/Tab.java
index 208645594..2a4c91743 100644
--- a/src/main/java/world/bentobox/bentobox/api/panels/Tab.java
+++ b/src/main/java/world/bentobox/bentobox/api/panels/Tab.java
@@ -1,5 +1,7 @@
package world.bentobox.bentobox.api.panels;
+import org.eclipse.jdt.annotation.Nullable;
+
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -25,7 +27,7 @@ public interface Tab {
* Return the panel items for this tab
* @return a list of items in slot order
*/
- List getPanelItems();
+ List<@Nullable PanelItem> getPanelItems();
/**
* @return the permission required to view this tab or empty if no permission required
diff --git a/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java b/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java
index 2ba6547e5..187b906ca 100644
--- a/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java
+++ b/src/main/java/world/bentobox/bentobox/api/panels/TabbedPanel.java
@@ -3,6 +3,7 @@ package world.bentobox.bentobox.api.panels;
import java.security.InvalidParameterException;
import java.util.List;
import java.util.Map.Entry;
+import java.util.Objects;
import java.util.TreeMap;
import org.bukkit.Material;
@@ -88,7 +89,7 @@ public class TabbedPanel extends Panel implements PanelListener {
// Show the active tab
if (tpb.getTabs().containsKey(activeTab)) {
List panelItems = tab.getPanelItems();
- panelItems.stream().skip(page * 43L).limit(page * 43L + 43L).forEach(i -> items.put(items.lastKey() + 1, i));
+ panelItems.stream().filter(Objects::nonNull).skip(page * 43L).limit(page * 43L + 43L).forEach(i -> items.put(items.lastKey() + 1, i));
// Add forward and backward icons
if (page > 0) {
// Previous page icon
diff --git a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java
index f3fabdf64..63143c5e8 100644
--- a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java
+++ b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java
@@ -56,8 +56,6 @@ public class BlueprintPaster {
private Location pos1;
// The maximum block position (x,y,z)
private Location pos2;
- // Speed of pasting
- private int pasteSpeed;
private PasteState pasteState;
private BukkitTask pastingTask;
private BlueprintClipboard clipboard;
@@ -113,7 +111,7 @@ public class BlueprintPaster {
// Initial state & speed
pasteState = PasteState.BLOCKS;
- pasteSpeed = plugin.getSettings().getPasteSpeed();
+ final int pasteSpeed = plugin.getSettings().getPasteSpeed();
pastingTask = Bukkit.getScheduler().runTaskTimer(plugin, () -> {
int count = 0;
diff --git a/src/main/java/world/bentobox/bentobox/database/json/JSONDatabaseHandler.java b/src/main/java/world/bentobox/bentobox/database/json/JSONDatabaseHandler.java
index 65434bd97..9ec4dfc73 100644
--- a/src/main/java/world/bentobox/bentobox/database/json/JSONDatabaseHandler.java
+++ b/src/main/java/world/bentobox/bentobox/database/json/JSONDatabaseHandler.java
@@ -59,7 +59,6 @@ public class JSONDatabaseHandler extends AbstractJSONDatabaseHandler {
try (FileReader reader = new FileReader(file)){
T object = getGson().fromJson(reader, dataObject);
if (object == null) {
- reader.close();
throw new IOException("JSON file created a null object: " + file.getPath());
}
list.add(object);
diff --git a/src/main/java/world/bentobox/bentobox/database/objects/Island.java b/src/main/java/world/bentobox/bentobox/database/objects/Island.java
index 05bbdea0c..f5a290a42 100644
--- a/src/main/java/world/bentobox/bentobox/database/objects/Island.java
+++ b/src/main/java/world/bentobox/bentobox/database/objects/Island.java
@@ -1188,7 +1188,7 @@ public class Island implements DataObject {
* @since 1.6.0
*/
public boolean isReserved() {
- return reserved == null ? false : reserved;
+ return reserved != null && reserved;
}
/**
diff --git a/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java b/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java
index a85d02485..6615691e6 100644
--- a/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java
+++ b/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java
@@ -42,11 +42,6 @@ public enum GameModePlaceholder {
ISLAND_PROTECTION_RANGE_DIAMETER("island_protection_range_diameter", (addon, user, island) -> island == null ? "" : String.valueOf(2 * island.getProtectionRange())),
ISLAND_OWNER("island_owner", (addon, user, island) -> island == null ? "" : addon.getPlayers().getName(island.getOwner())),
ISLAND_CREATION_DATE("island_creation_date", (addon, user, island) -> island == null ? "" : DateFormat.getInstance().format(Date.from(Instant.ofEpochMilli(island.getCreatedDate())))),
- /**
- * @deprecated As of 1.5.2, for removal; use {@link #ISLAND_CENTER} instead.
- */
- @Deprecated
- ISLAND_SPAWNPOINT("island_spawnpoint", (addon, user, island) -> island == null ? "" : Util.xyz(island.getCenter().toVector())),
ISLAND_NAME("island_name", (addon, user, island) -> {
if (island == null || island.getName() == null) {
return "";
diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandDeletionManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandDeletionManager.java
index 86903a4ec..64c92e9bf 100644
--- a/src/main/java/world/bentobox/bentobox/managers/IslandDeletionManager.java
+++ b/src/main/java/world/bentobox/bentobox/managers/IslandDeletionManager.java
@@ -62,7 +62,7 @@ public class IslandDeletionManager implements Listener {
});
}
// Remove the islands from the database so they don't come back
- toBeRemoved.forEach(handler::deleteObject);
+ //toBeRemoved.forEach(handler::deleteObject);
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
diff --git a/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java b/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java
index 26409e206..9a7857f9e 100644
--- a/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java
+++ b/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java
@@ -104,16 +104,6 @@ public class NewIsland {
return this;
}
- /**
- * @param world world where the island will go
- * @deprecated use {@link #addon} instead
- */
- @Deprecated
- public Builder world(World world) {
- this.world2 = world;
- return this;
- }
-
/**
* Set the addon
* @param addon a game mode addon
diff --git a/src/main/java/world/bentobox/bentobox/panels/settings/SettingsTab.java b/src/main/java/world/bentobox/bentobox/panels/settings/SettingsTab.java
index 103a5c503..63746b157 100644
--- a/src/main/java/world/bentobox/bentobox/panels/settings/SettingsTab.java
+++ b/src/main/java/world/bentobox/bentobox/panels/settings/SettingsTab.java
@@ -11,9 +11,12 @@ import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.event.inventory.ClickType;
+import org.eclipse.jdt.annotation.NonNull;
+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.Type;
+import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.panels.Panel;
import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.PanelItem.ClickHandler;
@@ -110,7 +113,8 @@ public class SettingsTab implements Tab, ClickHandler {
* @return list of all the panel items for this flag type
*/
@Override
- public List getPanelItems() {
+ @NonNull
+ public List<@Nullable PanelItem> getPanelItems() {
List flags = getFlags();
int i = 0;
// Jump past empty tabs
@@ -134,7 +138,8 @@ public class SettingsTab implements Tab, ClickHandler {
icons.put(7, new PanelItemBuilder().icon(Material.GOLD_INGOT)
.name(user.getTranslation(PROTECTION_PANEL + "mode.advanced.name"))
.description(user.getTranslation(PROTECTION_PANEL + "mode.advanced.description"), "",
- user.getTranslation(PROTECTION_PANEL + "mode.click-to-switch", "[next]", user.getTranslation(PROTECTION_PANEL + "mode.expert.name")))
+ user.getTranslation(PROTECTION_PANEL + "mode.click-to-switch",
+ TextVariables.NEXT, user.getTranslation(PROTECTION_PANEL + "mode.expert.name")))
.clickHandler(this)
.build());
break;
@@ -142,7 +147,8 @@ public class SettingsTab implements Tab, ClickHandler {
icons.put(7, new PanelItemBuilder().icon(Material.NETHER_BRICK)
.name(user.getTranslation(PROTECTION_PANEL + "mode.expert.name"))
.description(user.getTranslation(PROTECTION_PANEL + "mode.expert.description"), "",
- user.getTranslation(PROTECTION_PANEL + "mode.click-to-switch", "[next]", user.getTranslation(PROTECTION_PANEL + "mode.basic.name")))
+ user.getTranslation(PROTECTION_PANEL + "mode.click-to-switch",
+ TextVariables.NEXT, user.getTranslation(PROTECTION_PANEL + "mode.basic.name")))
.clickHandler(this)
.build());
break;
@@ -150,7 +156,8 @@ public class SettingsTab implements Tab, ClickHandler {
icons.put(7, new PanelItemBuilder().icon(Material.IRON_INGOT)
.name(user.getTranslation(PROTECTION_PANEL + "mode.basic.name"))
.description(user.getTranslation(PROTECTION_PANEL + "mode.basic.description"), "",
- user.getTranslation(PROTECTION_PANEL + "mode.click-to-switch", "[next]", user.getTranslation(PROTECTION_PANEL + "mode.advanced.name")))
+ user.getTranslation(PROTECTION_PANEL + "mode.click-to-switch",
+ TextVariables.NEXT, user.getTranslation(PROTECTION_PANEL + "mode.advanced.name")))
.clickHandler(this)
.build());
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 2aae1f19e..c4a046669 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,4 +1,4 @@
-# BentoBox Configuration 1.5.3
+# BentoBox Configuration 1.6.0
# This config file is dynamic and is updated right after BentoBox loaded its settings from it.
# You can edit it while the server is online and you can do '/bbox reload' to take the changes into account.
# However, it is a better practice to edit this file while the server is offline.
@@ -11,11 +11,11 @@ general:
# If there is no economy plugin present anyway, money will be automatically disabled.
use-economy: true
database:
- # JSON, MYSQL, MARIADB (10.2.3+), MONGODB, SQLITE and YAML(deprecated).
+ # JSON, MYSQL, MARIADB (10.2.3+), MONGODB, SQLITE, POSTGRESQL and YAML(deprecated).
# Transition database options are:
# YAML2JSON, YAML2MARIADB, YAML2MYSQL, YAML2MONGODB, YAML2SQLITE
- # JSON2MARIADB, JSON2MYSQL, JSON2MONGODB, JSON2SQLITE
- # MYSQL2JSON, MARIADB2JSON, MONGODB2JSON, SQLITE2JSON
+ # JSON2MARIADB, JSON2MYSQL, JSON2MONGODB, JSON2SQLITE, JSON2POSTGRESQL
+ # MYSQL2JSON, MARIADB2JSON, MONGODB2JSON, SQLITE2JSON, POSTGRESQL2JSON
# If you need others, please make a feature request.
# Transition options enable migration from one database type to another. Use /bbox migrate.
# YAML and JSON are file-based databases.
@@ -80,7 +80,7 @@ island:
reset: true
delay:
# Time in seconds that players have to stand still before teleport commands activate, e.g. island go.
- time: 0
+ time: 0
name:
# These set the minimum and maximum size of a name.
min-length: 4
@@ -107,7 +107,7 @@ web:
download-data: true
# Time in minutes between each connection to the GitHub API.
# This allows for up-to-the-minute information gathering.
- # However, as the GitHub API data does not get updated instantly, this value cannot be set less than 15 minutes.
+ # However, as the GitHub API data does not get updated instantly, this value cannot be set to less than 60 minutes.
# Setting this to 0 will make BentoBox download data only at startup.
# Added since 1.5.0.
connection-interval: 60
diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml
index 935b02dff..9c5f5c1df 100644
--- a/src/main/resources/locales/en-US.yml
+++ b/src/main/resources/locales/en-US.yml
@@ -177,7 +177,7 @@ commands:
description: "switch player's island to the numbered one in trash"
out-of-range: "&cNumber must be between 1 and [number]. Use &l[label] trash [player] &r&cto see island numbers"
cannot-switch: "&cSwitch failed. See console log for error."
- success: "&Successfully switched the player's island to the specified one."
+ success: "&aSuccessfully switched the player's island to the specified one."
trash:
no-unowned-in-trash: "&cNo unowned islands in trash"
no-islands-in-trash: "&cPlayer has no islands in trash"
diff --git a/src/main/resources/locales/lv-LV.yml b/src/main/resources/locales/lv-LV.yml
index 935e6c875..baf6fe4be 100644
--- a/src/main/resources/locales/lv-LV.yml
+++ b/src/main/resources/locales/lv-LV.yml
@@ -78,6 +78,11 @@ commands:
unowned:
description: "Dzēst bezīpašnieku salas - nepieciešams apstiprinājums"
unowned-islands: "&dAtrastas [number] salas"
+ protect:
+ description: Pārslēgt salas aizsargāšanu no dzēšanas
+ move-to-island: '&cSākumā pārvietojies uz salas!'
+ protecting: '&aDzēšanas aizsardzība aktivizēta'
+ unprotecting: '&aDzēšanas aizsardzība noņemta'
team:
add:
@@ -137,6 +142,7 @@ commands:
no-island-here: "&cŠeit neatrodas neviena sala! Apstiprini, lai izveidotu."
in-deletion: "&cŠī salas pozīcija šobrīt tiek dzēsta. Mēģini vēlāk."
cannot-make-island: "&cAtvaino, bet neizdevās izveidot šeit salu. Iespējams konsulē ir kļūdas paziņojumi."
+ reserved-island: '&aSala ir rezērvēta [xyz] priekš spēlētāja.'
unregister:
parameters: "<īpašnieks>"
description: "atreģistrē īpašnieku no salas paturot salas blokus"
@@ -164,11 +170,13 @@ commands:
banned-players: "Spēlētāji, kam liegts atrasties uz salas:"
banned-format: "&c[name]"
unowned: "&cBez īpašnieka"
+ purge-protected: Sala ir aizsargāta no dzēšanas
switchto:
parameters: " "
description: "uzstāda spēlētāja salu kā pirmo (vai doto) atkritnē"
out-of-range: "&cNumuram jābūt starp 1 un [number]. Lieto &l[label] trash [player]&r&c, lai redzētu salas numuru"
cannot-switch: "&cPārslēgšana neizdevās! Skaties kļūdu paziņojumu konsulē."
+ success: '&aSpēlētāja sala veiskmīgi pārslēgta uz uzstādīto numuru.'
trash:
no-unowned-in-trash: "&cNav salas atkritnē bez īpašniekiem"
no-islands-in-trash: "&cSpēlētājam nav salas atkritnē"
@@ -181,6 +189,7 @@ commands:
emptytrash:
parameters: "[spēlētājs]"
description: "iztīra atkritni no spēlētāja salām vai salām bez īpašnieka"
+ success: '&aAtkritne ir iztīrīta.'
version:
description: "attaino BentoBox un papildinājumu versijas"
setrange:
@@ -202,11 +211,16 @@ commands:
description: "uzstāda spēlētājam rangu uz viņa salas"
unknown-rank: "&cNezināms rangs!"
rank-set: "&aSpēlētājam nomainīts rangs no [from] uz [to]."
+ not-possible: '&cRangam ir jābūt lielākam par apmeklētāju'
setspawn:
description: "uzstāda kā sākuma salu šajā pasaulē visiem spēlētājiem"
already-spawn: "&cŠī sala jau ir uzstādīta kā sākuma sala!"
no-island-here: "&cŠeit nav neveinas salas."
confirmation: "&cVai tiešām vēlies uzstādīt šo salu kā sākuma salu?"
+ success: '&aŠī sala ir veiksmīgi uzstādīta kā sākuma sala šajā pasaulē.'
+ settings:
+ parameters: '[spēlētājs]'
+ description: atver sistēmas vai spēlētāja salas iestatījumus
blueprint:
management:
back: Atpakaļ
@@ -253,6 +267,10 @@ commands:
default-color: ''
success: Izdevās!
cancelling: Atceļ
+ slot: '&fVēlamā vieta [number]'
+ slot-instructions: |
+ &aKrisais klikšķis, lai palielinātu
+ &aLabais klikšķis, lai samazinātu
parameters: ""
description: "manipulē ar shēmām"
copy-first: "&cKopē shēmu sākumā!"
@@ -291,8 +309,10 @@ commands:
copying: '&bKopē blokus...'
mid-copy: '&cKopēšana vēl notiek. Pagaidi, kad tā beidzas.'
copied-percent: '&6Nokopēti [number]%'
+ bedrock-required: '&cVismaz vienam klintsakmenim ir jābūt shēmā!'
resetflags:
description: "Atiestatī visu salu noklusējuma karodziņu iestatījumus no config.yml"
+ success: '&aVeiksmīgi atiestatīti visi salu iestatījumi uz sākotnējām vērtībām.'
world:
description: "Pārvaldīt pasaules iestatījumus"
delete:
@@ -327,13 +347,15 @@ commands:
about:
description: "parādīt autortiesības un licenses informāciju"
reload:
- description: "parādīt iestatījumu, papildinājumus (ja atbalstīts) un valodas"
+ description: "parlādēt iestatījumus, papildinājumus (ja atbalstīts) un valodas"
locales-reloaded: "&2Valodas faili pārlādēti."
addons-reloaded: "&2Papildinājumu pārlādēti."
settings-reloaded: "&2Iestatījumi pārlādēti."
addon: '&6Pārlādē &b[name]&2.'
addon-reloaded: '&b[name] &2pārlādēts.'
unknown-addon: '&2Nezināms papildinājums!'
+ warning: '&cUzmanību: Pārlādēšana var izraisīt nestabilitāti, tādēļ, ja saskarieties ar problēmām,
+ pārstartējiet serveri.'
version:
plugin-version: "&2BentoBox versija: &3[version]"
description: "parādīt BentoBox un papildinājumu versijas"
@@ -342,6 +364,7 @@ commands:
addon-syntax: "&2[name] &3[version] &7(&3[state]&7)"
game-world: "&2[name] &7(&3[addon]&7): &aOverworld&7, &r[nether_color]Nether&7, &r[end_color]End"
server: "&2Darbojas uz &3[name] [version]&2."
+ database: '&2Databāze: &3[database]'
manage:
description: "parādīt pārvaldīšanas paneli"
catalog:
@@ -350,7 +373,11 @@ commands:
description: "veikt valodas faila analīzi"
see-console: |-
&aPārbaudi izdrukas, lai redzētu trūkstošos tulkojumus.
- &aŠī komanda var atgiezt pārāk daudz teksta, lai to rādītu sarakstē...
+ &aŠī komanda var atgiezt pārāk daudz teksta, lai to rādītu sarakstē...
+ delay:
+ previous-command-cancelled: '&cIepriekšēja komanda tika atcelta!'
+ stand-still: '&6Apstājies! Teleportēšana notiks pēc [seconds] sekundēm'
+ moved-so-command-cancelled: '&cTu pakustējies. Teleportēšana atcelta!'
confirmation:
confirm: "&cIevadi komandu atkārtoti &b[seconds]s&c laikā, lai apstiprinātu."
previous-request-cancelled: "&6Iepriekšējais apstiprinājumu pieprasījums ir apturēts."
@@ -428,6 +455,7 @@ commands:
cannot-coop-yourself: "&cTu nevari uzlikt sev šo rangu!"
already-has-rank: "&cSpēlētājam jau ir šis rangs!"
you-are-a-coop-member: "&2Tu esi uzstādīts kā sabiedrotajs spēlētājam [name]"
+ success: '&aSabiedrotā rangs uzstādīts spēlētājam &b[name].'
uncoop:
description: "noņemt spēlētājam sabiedrotā rangu"
parameters: ""
@@ -437,6 +465,7 @@ commands:
player-not-cooped: "&cSpēlētājs nav tavs sabiedrotais!"
you-are-no-longer-a-coop-member: "&cTu vairs neesi sabiedrotais [name] salā."
all-members-logged-off: "&cVisi salas spēlētāji ir izgājuši, tā ka tu vairs neesi sabiedrotais [name] salā."
+ success: '&b[name] &avairs nav sabiedrotais uz tavas salas.'
trust:
description: "uzstādīt spēlētājam uzticams rangu"
parameters: ""
@@ -444,6 +473,7 @@ commands:
members-trusted: "&cKomandas biedriem jau ir šis rangs!"
player-already-trusted: "&cSpēlētājam jau ir šis rangs!"
you-are-trusted: "&2Spēlētājs [name] tev uzticas!"
+ success: '&aUzticamā rangs uzstādīts spēlētājam &b[name]&a.'
untrust:
description: "noņemt spēlētājam uzticams rangu"
parameters: ""
@@ -451,6 +481,7 @@ commands:
cannot-untrust-member: "&cTu nevari noņemt šo rangu komandas spēlētājam!"
player-not-trusted: "&cSpēlētājam nav šis rangs!"
you-are-no-longer-trusted: "&cSpēlētājs [name] vairs tev neuzticas!"
+ success: '&b[name] &avairs nav uzticamais uz tavas salas.'
invite:
description: "uzaicini spēlētāju pievienoties tavai salai"
invitation-sent: "&aIelūgums nosūtīts [name]"
@@ -485,6 +516,7 @@ commands:
cannot-leave: "&cĪpašnieks nevar pamest komandu! Nodod salu citam vai izmet visus no komandas."
description: "pamest savu komandu"
left-your-island: "&c[name] &cpameta tavu komandu!"
+ success: '&aTu pameti šo salu.'
kick:
description: "izmest spēlētāju no tavas salas"
parameters: ""
@@ -496,6 +528,8 @@ commands:
parameters: ""
failure: "&cSpēlētājs jau sasniedzis zemāko rangu!"
success: "&aSpēlētājs [name] tika pazemināts uz [rank]"
+ errors:
+ cant-demote-yourself: '&cTu nevari pazemināt rangu pats sev!'
promote:
description: "paaugstina spēlētāja komandas rangu"
parameters: ""
@@ -545,6 +579,7 @@ commands:
cannot-ban-member: "&cTu nevari izraidīt komandas biedrus!"
not-on-island: "&cŠis spēlētājs nav uz tavas salas!"
player-expelled-you: "&b[name]&c izraidīja tevi no salas!"
+ success: '&aTu izmeti spēlētāju &b[name] &ano savas salas.'
ranks:
owner: "Īpašnieks"
@@ -556,26 +591,26 @@ ranks:
banned: "Aizliegtais"
admin: "Administrators"
mod: "Moderators"
-
+
protection:
command-is-banned: "Komanda nav atļauta apmeklētājiem"
flags:
- ANIMAL_SPAWN:
+ ANIMAL_SPAWN:
description: "Pārslēdz radīšanu"
name: "Dzīvnieku radīšana"
- ANVIL:
+ ANVIL:
description: "Pārslēdz izmantošanu"
name: "Laktas"
hint: "Laktas lietošana atslēgta"
- ARMOR_STAND:
+ ARMOR_STAND:
description: "Pārslēdz izmantošanu"
name: "Bruņu statīvi"
hint: "Bruņu statīva lietošana atslēgta"
- BEACON:
+ BEACON:
description: "Pārslēdz izmantošanu"
name: "Signāluguņi"
hint: "Signāluguņa lietošana atslēgta"
- BED:
+ BED:
description: "Pārslēdz izmantošanu"
name: "Gultas"
hint: "Gultas lietošana atslēgta"
@@ -583,23 +618,23 @@ protection:
name: "Laivas"
description: "Pārslēdz laivas izmantošanu"
hint: "Laivu lietošana atslēgta"
- BREAK_BLOCKS:
+ BREAK_BLOCKS:
description: "Pārslēdz plēšanu"
name: "Bloku plēšana"
hint: "Bloku plēšana atslēgta"
- BREEDING:
+ BREEDING:
description: "Pārslēdz vairošanu"
name: "Dzīvnieku vairošana"
hint: "Dzīvnieku vairošana ir aizsargāta"
- BREWING:
+ BREWING:
description: "Pārslēdz izmantošanu"
name: "Brūvēšanas satīvi"
hint: "Brūvēšana nav atļauta"
- BUCKET:
+ BUCKET:
description: "Pārslēdz izmantošanu"
name: "Spaiņi"
hint: "Spaiņu lietošana nav atļauta"
- BUTTON:
+ BUTTON:
description: "Pārslēdz pogu izmantošanu"
name: "Pogas"
hint: "Pogu spiešana nav atļauta"
@@ -631,40 +666,40 @@ protection:
CHEST_DAMAGE:
description: "Pārslēdz lāžu bojāšanu no sprādzieniem"
name: "Lāžu bojāšana"
- CHORUS_FRUIT:
+ CHORUS_FRUIT:
description: "Pārslēdz teleportāciju"
name: "Kora augļi"
hint: "Teleportācija nav atļauta"
CLEAN_SUPER_FLAT:
description: |-
- &aIeslēdz, lai notīrītu
- &asuper-plakanos gabalus
- &asalu pasaulēs
+ &aIeslēdz, lai notīrītu
+ &asuper-plakanos gabalus
+ &asalu pasaulēs
name: "Notīrīt plakanos gabalus"
COARSE_DIRT_TILLING:
description: |-
- &aPārslēdz rupjās zemes
- &aapstrādāšanu un podzola
- &asaplēšanu, lai iegūtu
- &amelnzemi
+ &aPārslēdz rupjās zemes
+ &aapstrādāšanu un podzola
+ &asaplēšanu, lai iegūtu
+ &amelnzemi
name: "Rupjās zemes apstrādāšana"
hint: "Rupjās zemes apstrādāšana nav atļauta"
- COLLECT_LAVA:
+ COLLECT_LAVA:
description: |-
- &aPārslēdz lavas savākšanu
- &a(pārraksta Spaiņu lietošanu)
+ &aPārslēdz lavas savākšanu
+ &a(pārraksta Spaiņu lietošanu)
name: "Savākt lavu"
hint: "Lavas savākšana nav atļauta"
- COLLECT_WATER:
+ COLLECT_WATER:
description: |-
- &aPārslēdz ūdens savākšanu
- &a(pārraksta Spaiņu lietošanu)
+ &aPārslēdz ūdens savākšanu
+ &a(pārraksta Spaiņu lietošanu)
name: "Ūdens savākšana"
hint: "Ūdens savākšana nav atļauta"
COMMAND_RANKS:
name: "&eKomandas Rangi"
description: "&aKonfigurēt komandas rangus"
- CRAFTING:
+ CRAFTING:
description: "Pārslēdz izmantošanu"
name: "Darbagaldi"
hint: "Darbagaldu lietošana nav atļauta"
@@ -675,11 +710,11 @@ protection:
description: "Pārslēdz krīpera postījumus"
name: "Krīpera postījumi"
hint: "Krīpera postījumi ir atslēgti"
- CROP_TRAMPLE:
+ CROP_TRAMPLE:
description: "Pārslēdz augu nomīdīšanu"
name: "Augu nomīdīšana"
hint: "Augu nomīdīšana ir atslēgta"
- DOOR:
+ DOOR:
description: "Pārslēdz durvju izmantošanu"
name: "Durvju izmantošana"
hint: "Durvju lietošana nav atļauta"
@@ -691,15 +726,15 @@ protection:
&cŠis liedz tās nolikt vai
&csaplēst.
hint: "Pūķa olu lietošana nav atļauta"
- EGGS:
+ EGGS:
description: "Pārslēdz olu mētāšanu"
name: "Olu mētāšana"
hint: "Olu mētāšana nav atļauta"
- ELYTRA:
+ ELYTRA:
description: "Pārslēdz deltaplāna lietošanu"
name: "Deltaplāns"
hint: "Deltaplāna lietošana nav atļauta"
- ENCHANTING:
+ ENCHANTING:
description: "Pārslēdz burvestību galda lietošanu"
name: "Burvestību galds"
hint: "Burvestību galda lietošana nav atļauta"
@@ -707,22 +742,22 @@ protection:
description: "Pārslēdz Ender lāžu veidošanu/lietošanu"
name: "Ender lādes"
hint: "Ender lādes ir izslēgtas šaja pasaulē"
- ENDERMAN_DEATH_DROP:
+ ENDERMAN_DEATH_DROP:
description: |-
- &aEndermeni nometīs jebkuru
- &abloku, kuru viņi tur, kad
- &atiek nogalināti
+ &aEndermeni nometīs jebkuru
+ &abloku, kuru viņi tur, kad
+ &atiek nogalināti
name: "Endermena nāves nomešana"
- ENDERMAN_GRIEFING:
+ ENDERMAN_GRIEFING:
description: |-
- &aEndermeni var paņemt
- &ajebkuru bloku uz salas
+ &aEndermeni var paņemt
+ &ajebkuru bloku uz salas
name: "Endermena bloku celšana"
- ENDER_PEARL:
+ ENDER_PEARL:
description: "Pārslēdz Ender pērļu lietošanu"
name: "Ender Pērles"
hint: "Ender pērļu lietošana nav atļauta"
- ENTER_EXIT_MESSAGES:
+ ENTER_EXIT_MESSAGES:
description: "Attaino ieejas/izejas ziņu"
island: "[name] sala"
name: "Ieejas/Izejas ziņa"
@@ -764,49 +799,49 @@ protection:
&auguni izmantojot karmu un
&adzelzi vai ugunsbumbas.
hint: "Karma un dzelzs un ugunsbumbas lietošana nav atļauta"
- FURNACE:
+ FURNACE:
description: "Pārslēdz iespēju lietot krāsnis"
name: "Krāsns"
hint: "Krāsns lietošana nav atļauta"
- GATE:
+ GATE:
description: "Pārslēdz iespēju lietot vārtus"
name: "Vārti"
hint: "Vārtu lietošana nav atļauta"
- GEO_LIMIT_MOBS:
+ GEO_LIMIT_MOBS:
description: |-
- &aNoņemt visas būtnes, kas
- &apamet salas aizsardzības
- &alaukumu
+ &aNoņemt visas būtnes, kas
+ &apamet salas aizsardzības
+ &alaukumu
name: "&eIerobežot būtnes iekš salas"
- HURT_ANIMALS:
+ HURT_ANIMALS:
description: "Pārslēdz iespēju ievainot dzīvniekus"
name: "Ievainot dzīvniekus"
hint: "Dzīvnieku ievainošana nav atļauta"
- HURT_MONSTERS:
+ HURT_MONSTERS:
description: "Pārslēdz iespēju ievainot briesmoņus"
name: "Ievainot briesmoņus"
hint: "Briesmoņu ievainošana nav atļauta"
- HURT_VILLAGERS:
+ HURT_VILLAGERS:
description: |-
- &aPārslēdz iespēju ievainot
- &aciemata iedzīvotājus
+ &aPārslēdz iespēju ievainot
+ &aciemata iedzīvotājus
name: "Ievainot ciematniekus"
hint: "Ciemata ievainošana ievainošana nav atļauta"
ITEM_FRAME:
name: "Priekšmetu rāmis"
description: |-
- &aPārslēdz iespēju izmantot
- &apriekšmeta rāmjus
+ &aPārslēdz iespēju izmantot
+ &apriekšmeta rāmjus
hint: "Priekšmeta rāmju lietošana nav atļauta"
ITEM_FRAME_DAMAGE:
description: |-
- &aPārslēdz iespēju briesmoņiem
- &abojāt priekšmeta rāmjus.
+ &aPārslēdz iespēju briesmoņiem
+ &abojāt priekšmeta rāmjus.
name: "Priekšmetu rāmju bojāšana"
- INVINCIBLE_VISITORS:
+ INVINCIBLE_VISITORS:
description: |-
- &aPārslēdz neuzveicamos
- &aapmeklētājus
+ &aPārslēdz neuzveicamos
+ &aapmeklētājus
name: "&eNeuzveicamie apmeklētāji"
hint: "&cApmeklētāji ir aizsargāti"
ISLAND_RESPAWN:
@@ -814,11 +849,11 @@ protection:
&aSpēlētāji parādīsies uz salas
&apēc nāves
name: "Parādīšanās uz salas"
- ITEM_DROP:
+ ITEM_DROP:
description: "Pārslēdz priekšmetu nomešanu"
name: "Priekšmetu nomešana"
hint: "Priekšmeti nevar tikt nomesti"
- ITEM_PICKUP:
+ ITEM_PICKUP:
description: "Pārslēdz priekšmetu pacelšanu"
name: "Priekšmetu pacelšana"
hint: "Priekšmeti nevar tikt pacelti"
@@ -829,7 +864,7 @@ protection:
LEAF_DECAY:
name: "Lapu pūšana"
description: "Pārslēdz dabīgo lapu pūšanu"
- LEASH:
+ LEASH:
description: "Pārslēdz pavadu lietošanu"
name: "Pavadi"
LEVER:
@@ -849,10 +884,10 @@ protection:
&cvarēs tecēt vertikāli, taču tie
&cneizplatīsies horizontālā virzienā,
&cja novietoti ārpus aizsardzības laukuma.
- LOCK:
+ LOCK:
description: "Pārslēdz salas aizslēgšanu"
name: "Aizslēgt salu"
- MILKING:
+ MILKING:
description: "Pārslēdz iespēju slaukt govis"
name: "Slaukšana"
hint: "Govju slaukšana nav atļauta"
@@ -860,10 +895,10 @@ protection:
name: "Vagoni"
description: "Pārslēdz iespēju lietot vagonus"
hint: "Vagonu lietošana nav atļauta"
- MONSTER_SPAWN:
+ MONSTER_SPAWN:
description: "Pārslēdz briesmoņu rašanos"
name: "Briesmoņu rašanās"
- MOUNT_INVENTORY:
+ MOUNT_INVENTORY:
description: |-
&aPārslēdz iespēju lietot
&aatvērt uzliekamos
@@ -884,7 +919,7 @@ protection:
&cŅem vērā, ka tas neapturēs radību
&crašanos no radību izsacuējiem vai
&cradīšanas olām.
- NOTE_BLOCK:
+ NOTE_BLOCK:
description: "Pārslēdz iespēju lietot nošu blokus"
name: "Nošu bloks"
hint: "Nošu blokus lietot nav atļauts"
@@ -911,12 +946,12 @@ protection:
&aiemītniekiem nav tiešsaitē.
&aVar samazināt servera noslodzi.
name: "Bezsaistes Sarkanakmens"
- PISTON_PUSH:
+ PISTON_PUSH:
description: |-
&aĻauj virzulim izstumt
&ablokus ārpus salas
name: "Bloku izbīdīšana"
- PLACE_BLOCKS:
+ PLACE_BLOCKS:
description: |-
&aPārslēdz iespēju novietot blokus
&auz salas.
@@ -941,27 +976,27 @@ protection:
&aBeigu protālu
name: "Beigu Portāls"
hint: "Beigu portālu lietošana nav atļauta"
- PRESSURE_PLATE:
+ PRESSURE_PLATE:
description: |-
&aPārslēdz iespēju izmantot
&aspiedienu plāksnes
name: "Spiediena plāksne"
hint: "Spiedienu plāksnes lietošana nav atļauta"
- PVP_END:
+ PVP_END:
description: |-
&cIeslēgt/Izslēgt spēlētājs
&cpret spēlētāja režīmu (PVP)
&cBeigu pasaulē.
name: "Biegu pasaules PVP"
hint: "&cSpēlētājs nevar izdarīt bojājumus citam spēlētājam Beigu pasaulē"
- PVP_NETHER:
+ PVP_NETHER:
description: |-
&cIeslēgt/Izslēgt spēlētājs
&cpret spēlētāja režīmu (PVP)
&cEllē.
name: "Elles PVP"
hint: "&cSpēlētājs nevar izdarīt bojājumus citam spēlētājam Ellē"
- PVP_OVERWORLD:
+ PVP_OVERWORLD:
description: |-
&cIeslēgt/Izslēgt spēlētājs
&cpret spēlētāja režīmu (PVP)
@@ -969,7 +1004,7 @@ protection:
name: "Virszemes PVP"
hint: "&cSpēlētājs nevar izdarīt bojājumus citam spēlētājam Virszemē"
active: "&cSpēlētāji var viens otram izdarīt bojājumus uz šīs salas!"
- REDSTONE:
+ REDSTONE:
description: |-
&aPārslēdz iespēju izmantot
&asarkanakmens lietas
@@ -981,25 +1016,25 @@ protection:
&auz salas, kas atrodas 0,0
&akoordinātēs
name: "Beigu izejas protāls"
- REMOVE_MOBS:
+ REMOVE_MOBS:
description: |-
&aNoņemt briesmoņus, kad
&aspēlētājs teleportējas
&auz salas.
name: "Noņemt briesmoņus"
- RIDING:
+ RIDING:
description: |-
&aPārslēdz iespēju spēlētājiem
&ajāt uz dzīviekiem.
name: "Jāšana uz dzīvniekiem"
hint: "Jāšana uz dzīvniekiem nav atļauta"
- SHEARING:
+ SHEARING:
description: |-
&aPārslēdz iespēju spēlētājiem
&acirpt aitas vai Mušmires.
name: "Cirpšana"
hint: "Cirpšana nav atļauta"
- SPAWN_EGGS:
+ SPAWN_EGGS:
description: |-
&aPārslēdz iespēju mest
&aradīšanas olas.
@@ -1021,7 +1056,7 @@ protection:
&aun Dzelzs lietošanas opcijas.
name: "Dinamīta aizdedzināšana"
hint: "Aizdedzināt dinamītu nav atļauts"
- TRADING:
+ TRADING:
description: |-
&aPārslēdz iespēju tirogties
&aar ciemata iedzīvotājiem.
@@ -1065,13 +1100,30 @@ protection:
&aNeļauj spēlētājam izmantot teleporta
&afunkcionalitāti, kamēr viņš krīt.
hint: "&cTu nevari teleportēties, kamēr krīti."
+ WITHER_DAMAGE:
+ name: Pārslēgt
+ description: |-
+ &aĻauj katlem saplēst blokus
+ &aun bojāt radības.
locked: "&cŠī sala ir slēgta!"
protected: "&cSala ir aizsargāta: [description]"
spawn-protected: "&cSākuma sala ir aizsargāta: [description]"
+ world-protected: "&cPasaule aizsargāta: [description]"
panel:
next: "Nākošā Lapa"
previous: "Iepriekšējā Lapa"
+ mode:
+ advanced:
+ name: '&6Advancētie iestatījumi'
+ description: '&aSatur saprātīga daudzuma iestatījumus.'
+ basic:
+ name: '&aBāzes iestatījumi'
+ description: '&aSatur biežāk lietotos iestatījumus.'
+ expert:
+ name: '&cEksperta iestatījumi'
+ description: '&aSatur visus iestatījumus.'
+ click-to-switch: '&eUzspied&a, lai pārslēgtos uz &r[next]&r&a.'
PROTECTION:
title: "&6Aizsardzība"
description: |-
@@ -1082,9 +1134,6 @@ protection:
description: |-
&aĢenerālie iestatījumi
&apriekš šīs salas
- WORLD_SETTING:
- title: "&b[world_name] &6Iestatījumi"
- description: "&aSpēles režīma iestatījumi"
flag-item:
name-layout: "&a[name]"
description-layout: |
@@ -1097,10 +1146,20 @@ protection:
menu-layout: "&a[description]"
setting-layout: |
&a[description]
-
+
&7Šībrīža iestatījumi: [setting]
setting-active: "&aAktīvs"
setting-disabled: "&cIzslēgts"
+ setting-cooldown: '&cIestatījumu maiņa ir ierobežota.'
+ WORLD_SETTING:
+ title: "&b[world_name] &6Iestatījumi"
+ description: "&aSpēles režīma iestatījumi"
+ WORLD_DEFAULTS:
+ title: '&b[world_name] &6Pasaules aizsardzība'
+ description: |
+ &aAizsardzības iestatījumi kuri ir
+ &aaktīvi, ja spēlētājs ir ārpus
+ &asavas salas
language:
panel-title: "Izvēlies valodu"
diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandCreateCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandCreateCommandTest.java
index 6cd047fcb..0cd80108e 100644
--- a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandCreateCommandTest.java
+++ b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandCreateCommandTest.java
@@ -145,7 +145,6 @@ public class IslandCreateCommandTest {
when(NewIsland.builder()).thenReturn(builder);
when(builder.player(any())).thenReturn(builder);
when(builder.name(Mockito.anyString())).thenReturn(builder);
- when(builder.world(any())).thenReturn(builder);
when(builder.addon(addon)).thenReturn(builder);
when(builder.reason(any())).thenReturn(builder);
when(builder.build()).thenReturn(mock(Island.class));
diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java
index 795ab5167..9f7ffef82 100644
--- a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java
+++ b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java
@@ -2,8 +2,12 @@ package world.bentobox.bentobox.api.commands.island;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.anyString;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
@@ -25,6 +29,7 @@ import org.bukkit.scheduler.BukkitScheduler;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
@@ -51,11 +56,16 @@ import world.bentobox.bentobox.managers.RanksManager;
@PrepareForTest({Bukkit.class, BentoBox.class, User.class })
public class IslandUnbanCommandTest {
+ @Mock
private CompositeCommand ic;
private UUID uuid;
+ @Mock
private User user;
+ @Mock
private IslandsManager im;
+ @Mock
private PlayersManager pm;
+ @Mock
private Island island;
/**
@@ -78,8 +88,7 @@ public class IslandUnbanCommandTest {
// Player
Player p = mock(Player.class);
- // Sometimes use Mockito.withSettings().verboseLogging()
- user = mock(User.class);
+ // User
when(user.isOp()).thenReturn(false);
uuid = UUID.randomUUID();
when(user.getUniqueId()).thenReturn(uuid);
@@ -87,18 +96,15 @@ public class IslandUnbanCommandTest {
when(user.getName()).thenReturn("tastybento");
// Parent command has no aliases
- ic = mock(CompositeCommand.class);
when(ic.getSubCommandAliases()).thenReturn(new HashMap<>());
// No island for player to begin with (set it later in the tests)
- im = mock(IslandsManager.class);
- when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(false);
- when(im.isOwner(Mockito.any(), Mockito.eq(uuid))).thenReturn(false);
+ when(im.hasIsland(any(), eq(uuid))).thenReturn(false);
+ when(im.isOwner(any(), eq(uuid))).thenReturn(false);
when(plugin.getIslands()).thenReturn(im);
// Has team
- pm = mock(PlayersManager.class);
- when(im.inTeam(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
+ when(im.inTeam(any(), eq(uuid))).thenReturn(true);
when(plugin.getPlayers()).thenReturn(pm);
// Server & Scheduler
@@ -107,16 +113,15 @@ public class IslandUnbanCommandTest {
when(Bukkit.getScheduler()).thenReturn(sch);
// Island Banned list initialization
- island = mock(Island.class);
when(island.getBanned()).thenReturn(new HashSet<>());
- when(island.isBanned(Mockito.any())).thenReturn(false);
- when(island.getRank(Mockito.any())).thenReturn(RanksManager.OWNER_RANK);
- when(im.getIsland(Mockito.any(), Mockito.any(User.class))).thenReturn(island);
- when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(island);
+ when(island.isBanned(any())).thenReturn(false);
+ when(island.getRank(any())).thenReturn(RanksManager.OWNER_RANK);
+ when(im.getIsland(any(), any(User.class))).thenReturn(island);
+ when(im.getIsland(any(), any(UUID.class))).thenReturn(island);
// IWM friendly name
IslandWorldManager iwm = mock(IslandWorldManager.class);
- when(iwm.getFriendlyName(Mockito.any())).thenReturn("BSkyBlock");
+ when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock");
when(plugin.getIWM()).thenReturn(iwm);
// Server and Plugin Manager for events
@@ -128,7 +133,7 @@ public class IslandUnbanCommandTest {
}
/**
- * Test method for .
+ * Test method for {@link IslandUnbanCommand#canExecute(User, String, List)}
*/
// Island ban command by itself
@@ -145,64 +150,82 @@ public class IslandUnbanCommandTest {
@Test
public void testNoArgs() {
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- assertFalse(iubc.execute(user, iubc.getLabel(), new ArrayList<>()));
+ assertFalse(iubc.canExecute(user, iubc.getLabel(), new ArrayList<>()));
}
+ /**
+ * Test method for {@link IslandUnbanCommand#canExecute(User, String, List)}
+ */
@Test
public void testNoIsland() {
- when(im.inTeam(Mockito.any(), Mockito.eq(uuid))).thenReturn(false);
+ when(im.inTeam(any(), eq(uuid))).thenReturn(false);
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- assertFalse(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill")));
- Mockito.verify(user).sendMessage("general.errors.no-island");
+ assertFalse(iubc.canExecute(user, iubc.getLabel(), Collections.singletonList("bill")));
+ verify(user).sendMessage("general.errors.no-island");
}
+ /**
+ * Test method for {@link IslandUnbanCommand#canExecute(User, String, List)}
+ */
@Test
public void testTooLowRank() {
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
- when(island.getRank(Mockito.any())).thenReturn(RanksManager.MEMBER_RANK);
+ when(im.hasIsland(any(), eq(uuid))).thenReturn(true);
+ when(island.getRank(any())).thenReturn(RanksManager.MEMBER_RANK);
when(island.getRankCommand(anyString())).thenReturn(RanksManager.OWNER_RANK);
- assertFalse(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill")));
- Mockito.verify(user).sendMessage("general.errors.no-permission");
+ assertFalse(iubc.canExecute(user, iubc.getLabel(), Collections.singletonList("bill")));
+ verify(user).sendMessage("general.errors.no-permission");
}
+ /**
+ * Test method for {@link IslandUnbanCommand#canExecute(User, String, List)}
+ */
@Test
public void testUnknownUser() {
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
- when(im.isOwner(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
+ when(im.hasIsland(any(), eq(uuid))).thenReturn(true);
+ when(im.isOwner(any(), eq(uuid))).thenReturn(true);
when(pm.getUUID(Mockito.anyString())).thenReturn(null);
- assertFalse(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill")));
- Mockito.verify(user).sendMessage("general.errors.unknown-player", "[name]", "bill");
+ assertFalse(iubc.canExecute(user, iubc.getLabel(), Collections.singletonList("bill")));
+ verify(user).sendMessage("general.errors.unknown-player", "[name]", "bill");
}
+ /**
+ * Test method for {@link IslandUnbanCommand#canExecute(User, String, List)}
+ */
@Test
public void testBanSelf() {
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
- when(im.isOwner(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
+ when(im.hasIsland(any(), eq(uuid))).thenReturn(true);
+ when(im.isOwner(any(), eq(uuid))).thenReturn(true);
when(pm.getUUID(Mockito.anyString())).thenReturn(uuid);
- assertFalse(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill")));
- Mockito.verify(user).sendMessage("commands.island.unban.cannot-unban-yourself");
+ assertFalse(iubc.canExecute(user, iubc.getLabel(), Collections.singletonList("bill")));
+ verify(user).sendMessage("commands.island.unban.cannot-unban-yourself");
}
+ /**
+ * Test method for {@link IslandUnbanCommand#canExecute(User, String, List)}
+ */
@Test
public void testBanNotBanned() {
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
- when(im.isOwner(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
+ when(im.hasIsland(any(), eq(uuid))).thenReturn(true);
+ when(im.isOwner(any(), eq(uuid))).thenReturn(true);
UUID bannedUser = UUID.randomUUID();
when(pm.getUUID(Mockito.anyString())).thenReturn(bannedUser);
- when(island.isBanned(Mockito.eq(bannedUser))).thenReturn(false);
- assertFalse(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill")));
- Mockito.verify(user).sendMessage("commands.island.unban.player-not-banned");
+ when(island.isBanned(eq(bannedUser))).thenReturn(false);
+ assertFalse(iubc.canExecute(user, iubc.getLabel(), Collections.singletonList("bill")));
+ verify(user).sendMessage("commands.island.unban.player-not-banned");
}
+ /**
+ * Test method for {@link IslandUnbanCommand#execute(User, String, List)}
+ */
@Test
public void testUnbanUser() {
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
- when(im.isOwner(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
+ when(im.hasIsland(any(), eq(uuid))).thenReturn(true);
+ when(im.isOwner(any(), eq(uuid))).thenReturn(true);
UUID targetUUID = UUID.randomUUID();
when(pm.getUUID(Mockito.anyString())).thenReturn(targetUUID);
PowerMockito.mockStatic(User.class);
@@ -210,23 +233,26 @@ public class IslandUnbanCommandTest {
when(targetUser.isOp()).thenReturn(false);
when(targetUser.isPlayer()).thenReturn(true);
when(targetUser.isOnline()).thenReturn(false);
- when(User.getInstance(Mockito.any(UUID.class))).thenReturn(targetUser);
+ when(User.getInstance(any(UUID.class))).thenReturn(targetUser);
// Mark as banned
- when(island.isBanned(Mockito.eq(targetUUID))).thenReturn(true);
+ when(island.isBanned(eq(targetUUID))).thenReturn(true);
// Allow removing from ban list
- when(island.unban(Mockito.any(), Mockito.any())).thenReturn(true);
+ when(island.unban(any(), any())).thenReturn(true);
assertTrue(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill")));
- Mockito.verify(user).sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, targetUser.getName());
- Mockito.verify(targetUser).sendMessage("commands.island.unban.you-are-unbanned", TextVariables.NAME, user.getName());
+ verify(user).sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, targetUser.getName());
+ verify(targetUser).sendMessage("commands.island.unban.you-are-unbanned", TextVariables.NAME, user.getName());
}
+ /**
+ * Test method for {@link IslandUnbanCommand#execute(User, String, List)}
+ */
@Test
public void testCancelledUnban() {
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
- when(im.hasIsland(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
- when(im.isOwner(Mockito.any(), Mockito.eq(uuid))).thenReturn(true);
+ when(im.hasIsland(any(), eq(uuid))).thenReturn(true);
+ when(im.isOwner(any(), eq(uuid))).thenReturn(true);
UUID targetUUID = UUID.randomUUID();
when(pm.getUUID(Mockito.anyString())).thenReturn(targetUUID);
PowerMockito.mockStatic(User.class);
@@ -234,18 +260,21 @@ public class IslandUnbanCommandTest {
when(targetUser.isOp()).thenReturn(false);
when(targetUser.isPlayer()).thenReturn(true);
when(targetUser.isOnline()).thenReturn(false);
- when(User.getInstance(Mockito.any(UUID.class))).thenReturn(targetUser);
+ when(User.getInstance(any(UUID.class))).thenReturn(targetUser);
// Mark as banned
- when(island.isBanned(Mockito.eq(targetUUID))).thenReturn(true);
+ when(island.isBanned(eq(targetUUID))).thenReturn(true);
// Allow removing from ban list
- when(island.unban(Mockito.any(), Mockito.any())).thenReturn(false);
+ when(island.unban(any(), any())).thenReturn(false);
assertFalse(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill")));
- Mockito.verify(user, Mockito.never()).sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, targetUser.getName());
- Mockito.verify(targetUser, Mockito.never()).sendMessage("commands.island.unban.you-are-unbanned", "[owner]", user.getName());
+ verify(user, never()).sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, targetUser.getName());
+ verify(targetUser, never()).sendMessage("commands.island.unban.you-are-unbanned", "[owner]", user.getName());
}
+ /**
+ * Test method for {@link IslandUnbanCommand#tabComplete(User, String, List)}
+ */
@Test
public void testTabComplete() {
Set banned = new HashSet<>();
@@ -254,7 +283,7 @@ public class IslandUnbanCommandTest {
banned.add(UUID.randomUUID());
}
when(island.getBanned()).thenReturn(banned);
- when(pm.getName(Mockito.any())).thenReturn("a", "b", "c", "d", "e", "f", "g", "h", "i", "j");
+ when(pm.getName(any())).thenReturn("a", "b", "c", "d", "e", "f", "g", "h", "i", "j");
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
User user = mock(User.class);
when(user.getUniqueId()).thenReturn(UUID.randomUUID());
@@ -264,10 +293,13 @@ public class IslandUnbanCommandTest {
assertTrue(Arrays.equals(names, result.get().toArray()));
}
+ /**
+ * Test method for {@link IslandUnbanCommand#tabComplete(User, String, List)}
+ */
@Test
public void testTabCompleteNoIsland() {
// No island
- when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(null);
+ when(im.getIsland(any(), any(UUID.class))).thenReturn(null);
IslandUnbanCommand iubc = new IslandUnbanCommand(ic);
// Set up the user
User user = mock(User.class);
diff --git a/src/test/java/world/bentobox/bentobox/managers/IslandDeletionManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/IslandDeletionManagerTest.java
new file mode 100644
index 000000000..8e698d801
--- /dev/null
+++ b/src/test/java/world/bentobox/bentobox/managers/IslandDeletionManagerTest.java
@@ -0,0 +1,197 @@
+package world.bentobox.bentobox.managers;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Comparator;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.plugin.PluginManager;
+import org.bukkit.scheduler.BukkitScheduler;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.reflect.Whitebox;
+
+import world.bentobox.bentobox.BentoBox;
+import world.bentobox.bentobox.Settings;
+import world.bentobox.bentobox.api.events.BentoBoxReadyEvent;
+import world.bentobox.bentobox.api.events.island.IslandEvent.IslandDeleteChunksEvent;
+import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType;
+import world.bentobox.bentobox.database.objects.Island;
+import world.bentobox.bentobox.database.objects.IslandDeletion;
+import world.bentobox.bentobox.util.Util;
+
+/**
+ * @author tastybento
+ *
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest( { Bukkit.class, BentoBox.class, Util.class, Location.class })
+public class IslandDeletionManagerTest {
+
+ @Mock
+ private BentoBox plugin;
+ // Class under test
+ private IslandDeletionManager idm;
+ @Mock
+ private Location location;
+ @Mock
+ private World world;
+ @Mock
+ private Island island;
+ @Mock
+ private PluginManager pim;
+ @Mock
+ private BukkitScheduler scheduler;
+
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ // Bukkit
+ PowerMockito.mockStatic(Bukkit.class);
+ Server server = mock(Server.class);
+ when(server.getWorld(anyString())).thenReturn(world);
+ when(Bukkit.getServer()).thenReturn(server);
+ when(Bukkit.getPluginManager()).thenReturn(pim);
+ when(server.getPluginManager()).thenReturn(pim);
+ when(Bukkit.getScheduler()).thenReturn(scheduler);
+
+ // Clear any remaining database
+ clearDatabase();
+ // Set up plugin
+ plugin = mock(BentoBox.class);
+ Whitebox.setInternalState(BentoBox.class, "instance", plugin);
+ // Settings
+ Settings s = mock(Settings.class);
+ when(plugin.getSettings()).thenReturn(s);
+ when(s.getDatabaseType()).thenReturn(DatabaseType.JSON);
+ // Location
+ when(location.getWorld()).thenReturn(world);
+ when(world.getName()).thenReturn("bskyblock");
+ // Island
+ when(island.getCenter()).thenReturn(location);
+
+ // Island Deletion Manager
+ idm = new IslandDeletionManager(plugin);
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @After
+ public void tearDown() throws Exception {
+ clearDatabase();
+ }
+
+
+ private void clearDatabase() throws Exception {
+ //remove any database data
+ File file = new File("database");
+ Path pathToBeDeleted = file.toPath();
+ if (file.exists()) {
+ Files.walk(pathToBeDeleted)
+ .sorted(Comparator.reverseOrder())
+ .map(Path::toFile)
+ .forEach(File::delete);
+ }
+
+ }
+
+ /**
+ * Test method for {@link world.bentobox.bentobox.managers.IslandDeletionManager#IslandDeletionManager(BentoBox)}.
+ */
+ @Test
+ public void testIslandDeletionManager() {
+ // Nothing
+ }
+
+ /**
+ * Test method for {@link world.bentobox.bentobox.managers.IslandDeletionManager#onBentoBoxReady(world.bentobox.bentobox.api.events.BentoBoxReadyEvent)}.
+ */
+ @Test
+ public void testOnBentoBoxReadyNullWorld() {
+ when(location.getWorld()).thenReturn(null);
+ // Delete island on previous server operation
+ testOnIslandDelete();
+ // Start server
+ BentoBoxReadyEvent e = new BentoBoxReadyEvent();
+ idm.onBentoBoxReady(e);
+ verify(plugin).log("There are 1 islands pending deletion.");
+ verify(plugin).logError("Island queued for deletion refers to a non-existant game world. Skipping...");
+ }
+
+ /**
+ * Test method for {@link world.bentobox.bentobox.managers.IslandDeletionManager#onBentoBoxReady(world.bentobox.bentobox.api.events.BentoBoxReadyEvent)}.
+ */
+ @Test
+ public void testOnBentoBoxReady() {
+ // Delete island on previous server operation
+ testOnIslandDelete();
+ // Add world
+ when(location.getWorld()).thenReturn(world);
+ // Start server
+ BentoBoxReadyEvent e = new BentoBoxReadyEvent();
+ idm.onBentoBoxReady(e);
+ verify(plugin).log("There are 1 islands pending deletion.");
+ verify(plugin, never()).logError("Island queued for deletion refers to a non-existant game world. Skipping...");
+ verify(plugin).log("Resuming deletion of island at bskyblock 0,0,0");
+ }
+
+ /**
+ * Test method for {@link world.bentobox.bentobox.managers.IslandDeletionManager#onIslandDelete(world.bentobox.bentobox.api.events.island.IslandEvent.IslandDeleteChunksEvent)}.
+ */
+ @Test
+ public void testOnIslandDelete() {
+ // Delete some islands
+ IslandDeleteChunksEvent e = mock(IslandDeleteChunksEvent.class);
+ IslandDeletion id = new IslandDeletion(island);
+ when(e.getDeletedIslandInfo()).thenReturn(id);
+ when(e.getIsland()).thenReturn(island);
+
+ idm.onIslandDelete(e);
+ verify(e, times(2)).getDeletedIslandInfo();
+ // Verify database save
+ File file = new File("database", "IslandDeletion");
+ assertTrue(file.exists());
+ File entry = new File(file, id.getUniqueId() + ".json");
+ assertTrue(entry.exists());
+ }
+
+ /**
+ * Test method for {@link world.bentobox.bentobox.managers.IslandDeletionManager#onIslandDeleted(world.bentobox.bentobox.api.events.island.IslandEvent.IslandDeletedEvent)}.
+ */
+ @Test
+ public void testOnIslandDeleted() {
+
+ }
+
+ /**
+ * Test method for {@link world.bentobox.bentobox.managers.IslandDeletionManager#inDeletion(org.bukkit.Location)}.
+ */
+ @Test
+ public void testInDeletion() {
+ assertFalse(idm.inDeletion(location));
+ }
+
+}
diff --git a/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java
index 8c33d856a..3d4c3ca4b 100644
--- a/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java
+++ b/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java
@@ -155,8 +155,6 @@ public class IslandsManagerTest {
// World
when(world.getEnvironment()).thenReturn(World.Environment.NORMAL);
- // Set up plugin
- Whitebox.setInternalState(BentoBox.class, "instance", plugin);
// Command manager
CommandsManager cm = mock(CommandsManager.class);