Merge branch 'develop' of https://github.com/BentoBoxWorld/BentoBox.git into develop

This commit is contained in:
tastybento 2019-08-16 08:27:05 -07:00
commit 08e520565d
27 changed files with 541 additions and 274 deletions

View File

@ -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!

View File

@ -80,7 +80,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>1.6.0</build.version>
<build.version>1.7.0</build.version>
</properties>
<!-- Profiles will allow to automatically change build version. -->

View File

@ -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<String, Integer> 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;
}));
}
}

View File

@ -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<String> args) {
public boolean canExecute(User user, String label, List<String> 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<String> 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 ->

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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
*/

View File

@ -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
*/

View File

@ -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
*/

View File

@ -359,6 +359,7 @@ public class Flag implements Comparable<Flag> {
* @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) {

View File

@ -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]";
}

View File

@ -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<PanelItem> getPanelItems();
List<@Nullable PanelItem> getPanelItems();
/**
* @return the permission required to view this tab or empty if no permission required

View File

@ -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<PanelItem> 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

View File

@ -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;

View File

@ -59,7 +59,6 @@ public class JSONDatabaseHandler<T> extends AbstractJSONDatabaseHandler<T> {
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);

View File

@ -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;
}
/**

View File

@ -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 "";

View File

@ -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)

View File

@ -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

View File

@ -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<PanelItem> getPanelItems() {
@NonNull
public List<@Nullable PanelItem> getPanelItems() {
List<Flag> 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());
}

View File

@ -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

View File

@ -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"

View File

@ -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: "<spēlētājs> <numurs>"
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: "<load/copy/paste/pos1/pos2/save>"
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: "<spēlētājs>"
@ -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: "<spēlētājs>"
@ -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: "<spēlētājs>"
@ -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: "<spēlētājs>"
@ -496,6 +528,8 @@ commands:
parameters: "<spēlētājs>"
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: "<spēlētājs>"
@ -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"

View File

@ -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));

View File

@ -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<UUID> 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);

View File

@ -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));
}
}

View File

@ -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);