Merge remote-tracking branch 'origin/develop'

Conflicts:
	.gitignore
This commit is contained in:
tastybento 2020-04-19 08:30:32 -07:00
commit c62de9d021
19 changed files with 458 additions and 129 deletions

92
.gitignore vendored
View File

@ -1,4 +1,88 @@
/target/ # Git
/.DS_Store *.orig
/.classpath !.gitignore
/.project /.settings/
# Windows
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
*.stackdump
[Dd]esktop.ini
$RECYCLE.BIN/
*.lnk
# Linux
*~
.fuse_hidden*
.directory
.Trash-*
.nfs*
# MacOS
.DS_Store
.AppleDouble
.LSOverride
._*
# Java
*.class
*.log
*.ctxt
.mtj.tmp/
*.jar
*.war
*.nar
*.ear
hs_err_pid*
# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
# Intellij
*.iml
*.java___jb_tmp___
.idea/*
*.ipr
*.iws
/out/
.idea_modules/
# Eclipse
*.pydevproject
.metadata
.gradle
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.project
.externalToolBuilders/
*.launch
.cproject
.classpath
.buildpath
.target
# NetBeans
nbproject/private/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
nb-configuration.xml
.nb-gradle/

20
pom.xml
View File

@ -8,9 +8,9 @@
<artifactId>warps</artifactId> <artifactId>warps</artifactId>
<version>${revision}</version> <version>${revision}</version>
<name>WelcomeWarpSigns</name> <name>Warps</name>
<description>WelcomeWarpSigns is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like ASkyBlock or AcidIsland.</description> <description>Warps is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like ASkyBlock or AcidIsland.</description>
<url>https://github.com/BentoBoxWorld/addon-welcomewarpsigns</url> <url>https://github.com/BentoBoxWorld/Warps</url>
<inceptionYear>2018</inceptionYear> <inceptionYear>2018</inceptionYear>
<developers> <developers>
@ -25,19 +25,19 @@
</developers> </developers>
<scm> <scm>
<connection>scm:git:https://github.com/BentoBoxWorld/addon-welcomewarpsigns.git</connection> <connection>scm:git:https://github.com/BentoBoxWorld/Warps.git</connection>
<developerConnection>scm:git:git@github.com:BentoBoxWorld/addon-welcomewarpsigns.git</developerConnection> <developerConnection>scm:git:git@github.com:BentoBoxWorld/Warps.git</developerConnection>
<url>https://github.com/BentoBoxWorld/addon-welcomewarpsigns</url> <url>https://github.com/BentoBoxWorld/Warps</url>
</scm> </scm>
<ciManagement> <ciManagement>
<system>jenkins</system> <system>jenkins</system>
<url>http://ci.codemc.org/job/BentoBoxWorld/job/addon-welcomewarpsigns</url> <url>http://ci.codemc.org/job/BentoBoxWorld/job/Warps</url>
</ciManagement> </ciManagement>
<issueManagement> <issueManagement>
<system>GitHub</system> <system>GitHub</system>
<url>https://github.com/BentoBoxWorld/addon-welcomewarpsigns/issues</url> <url>https://github.com/BentoBoxWorld/Warps/issues</url>
</issueManagement> </issueManagement>
<distributionManagement> <distributionManagement>
@ -66,7 +66,7 @@
<!-- Do not change unless you want different name for local builds. --> <!-- Do not change unless you want different name for local builds. -->
<build.number>-LOCAL</build.number> <build.number>-LOCAL</build.number>
<!-- This allows to change between versions. --> <!-- This allows to change between versions. -->
<build.version>1.9.1</build.version> <build.version>1.9.3</build.version>
</properties> </properties>
<!-- Profiles will allow to automatically change build version. --> <!-- Profiles will allow to automatically change build version. -->
@ -331,4 +331,4 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

View File

@ -4,19 +4,23 @@ import java.util.List;
import org.bukkit.Material; import org.bukkit.Material;
import com.google.gson.annotations.Expose;
/** /**
* Stores info on a warp sign * Stores info on a warp sign
* @author tastybento * @author tastybento
* *
*/ */
public class SignCache { public class SignCacheItem {
@Expose
private final List<String> signText; private final List<String> signText;
@Expose
private final Material type; private final Material type;
/** /**
* @param signText * @param signText
* @param type * @param type
*/ */
public SignCache(List<String> signText, Material type) { public SignCacheItem(List<String> signText, Material type) {
this.signText = signText; this.signText = signText;
this.type = type; this.type = type;
} }

View File

@ -0,0 +1,79 @@
package world.bentobox.warps;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World;
import world.bentobox.bentobox.database.Database;
import world.bentobox.warps.objects.SignCache;
public class SignCacheManager {
private Map<World, Map<UUID, SignCacheItem>> cachedSigns = new HashMap<>();
private Warp addon;
// Database handler for level data
private Database<SignCache> handler;
public SignCacheManager(Warp addon) {
this.addon = addon;
handler = new Database<>(addon, SignCache.class);
// Load the sign caches
loadCache();
}
private void loadCache() {
handler.loadObjects().forEach(w -> {
World world = Bukkit.getWorld(w.getUniqueId());
if (world != null) {
cachedSigns.put(world, w.getSigns());
}
});
}
void saveCache() {
cachedSigns.forEach((w, m) -> handler.saveObject(new SignCache(w, m)));
}
Material getSignIcon(World world, UUID warpOwner) {
// Add the worlds if we haven't seen this before
cachedSigns.putIfAbsent(world, new HashMap<>());
if (cachedSigns.get(world).containsKey(warpOwner)) {
return cachedSigns.get(world).get(warpOwner).getType();
}
// Not in cache
SignCacheItem sc = addon.getWarpSignsManager().getSignInfo(world, warpOwner);
cachedSigns.get(world).put(warpOwner, sc);
return sc.getType();
}
/**
* Gets sign text and cache it
* @param playerUUID
* @return sign text in a list
*/
List<String> getSign(World world, UUID playerUUID) {
// Add the worlds if we haven't seen this before
cachedSigns.putIfAbsent(world, new HashMap<>());
if (cachedSigns.get(world).containsKey(playerUUID)) {
return cachedSigns.get(world).get(playerUUID).getSignText();
}
SignCacheItem result = addon.getWarpSignsManager().getSignInfo(world, playerUUID);
cachedSigns.get(world).put(playerUUID, result);
return result.getSignText();
}
/**
* Removes sign text from the cache
* @param world - world
* @param key - uuid of owner
*/
void removeWarp(World world, UUID key) {
cachedSigns.putIfAbsent(world, new HashMap<>());
cachedSigns.get(world).remove(key);
}
}

View File

@ -16,6 +16,7 @@ import world.bentobox.level.Level;
import world.bentobox.warps.commands.WarpCommand; import world.bentobox.warps.commands.WarpCommand;
import world.bentobox.warps.commands.WarpsCommand; import world.bentobox.warps.commands.WarpsCommand;
import world.bentobox.warps.config.Settings; import world.bentobox.warps.config.Settings;
import world.bentobox.warps.listeners.WarpSignsListener;
/** /**
* Addin to BentoBox that enables welcome warp signs * Addin to BentoBox that enables welcome warp signs
@ -147,6 +148,8 @@ public class Warp extends Addon {
// Save the warps // Save the warps
if (warpSignsManager != null) if (warpSignsManager != null)
warpSignsManager.saveWarpList(); warpSignsManager.saveWarpList();
if (warpPanelManager != null)
warpPanelManager.saveCache();
} }
@ -171,7 +174,7 @@ public class Warp extends Addon {
/** /**
* Get warp panel manager * Get warp panel manager
* @return * @return Warp Panel Manager
*/ */
public WarpPanelManager getWarpPanelManager() { public WarpPanelManager getWarpPanelManager() {
return warpPanelManager; return warpPanelManager;

View File

@ -1,9 +1,7 @@
package world.bentobox.warps; package world.bentobox.warps;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.UUID; import java.util.UUID;
@ -21,20 +19,19 @@ public class WarpPanelManager {
private static final int PANEL_MAX_SIZE = 52; private static final int PANEL_MAX_SIZE = 52;
private Warp addon; private Warp addon;
// This is a cache of signs // This is a cache of signs
private Map<World, Map<UUID, SignCache>> cachedSigns = new HashMap<>(); private SignCacheManager signCacheManager;
public WarpPanelManager(Warp addon) { public WarpPanelManager(Warp addon) {
this.addon = addon; this.addon = addon;
signCacheManager = new SignCacheManager(addon);
} }
private PanelItem getPanelItem(World world, UUID warpOwner) { private PanelItem getPanelItem(World world, UUID warpOwner) {
PanelItemBuilder pib = new PanelItemBuilder() PanelItemBuilder pib = new PanelItemBuilder()
.name(addon.getSettings().getNameFormat() + addon.getPlugin().getPlayers().getName(warpOwner)) .name(addon.getSettings().getNameFormat() + addon.getPlugin().getPlayers().getName(warpOwner))
.description(getSign(world, warpOwner)) .description(signCacheManager.getSign(world, warpOwner))
.clickHandler((panel, clicker, click, slot) -> hander(world, clicker, warpOwner)); .clickHandler((panel, clicker, click, slot) -> hander(world, clicker, warpOwner));
Material icon = getSignIcon(world, warpOwner); Material icon = signCacheManager.getSignIcon(world, warpOwner);
if (icon.equals(Material.PLAYER_HEAD)) { if (icon.equals(Material.PLAYER_HEAD)) {
return pib.icon(addon.getPlayers().getName(warpOwner)).build(); return pib.icon(addon.getPlayers().getName(warpOwner)).build();
} else { } else {
@ -44,7 +41,10 @@ public class WarpPanelManager {
private boolean hander(World world, User clicker, UUID warpOwner) { private boolean hander(World world, User clicker, UUID warpOwner) {
clicker.closeInventory(); clicker.closeInventory();
addon.getWarpSignsManager().warpPlayer(world, clicker, warpOwner); String playerCommand = addon.getPlugin().getIWM().getAddon(world).map(gm -> gm.getPlayerCommand().map(c -> c.getLabel()).orElse("")).orElse("");
String command = addon.getSettings().getWarpCommand() + " " + addon.getPlayers().getName(warpOwner);
clicker.getPlayer().performCommand((playerCommand.isEmpty() ? "" : playerCommand + " ") + command);
//addon.getWarpSignsManager().warpPlayer(world, clicker, warpOwner);
return true; return true;
} }
@ -56,35 +56,6 @@ public class WarpPanelManager {
.icon(Material.END_CRYSTAL).build(); .icon(Material.END_CRYSTAL).build();
} }
private Material getSignIcon(World world, UUID warpOwner) {
// Add the worlds if we haven't seen this before
cachedSigns.putIfAbsent(world, new HashMap<>());
if (cachedSigns.get(world).containsKey(warpOwner)) {
return cachedSigns.get(world).get(warpOwner).getType();
}
// Not in cache
SignCache sc = addon.getWarpSignsManager().getSignInfo(world, warpOwner);
cachedSigns.get(world).put(warpOwner, sc);
return sc.getType();
}
/**
* Gets sign text and cache it
* @param playerUUID
* @return sign text in a list
*/
private List<String> getSign(World world, UUID playerUUID) {
// Add the worlds if we haven't seen this before
cachedSigns.putIfAbsent(world, new HashMap<>());
if (cachedSigns.get(world).containsKey(playerUUID)) {
return cachedSigns.get(world).get(playerUUID).getSignText();
}
SignCache result = addon.getWarpSignsManager().getSignInfo(world, playerUUID);
cachedSigns.get(world).put(playerUUID, result);
return result.getSignText();
}
/** /**
* Show the warp panel for the user * Show the warp panel for the user
* @param world - world * @param world - world
@ -145,11 +116,15 @@ public class WarpPanelManager {
/** /**
* Removes sign text from the cache * Removes sign text from the cache
* @param key * @param world - world
* @param key - uuid of owner
*/ */
public void removeWarp(World world, UUID key) { public void removeWarp(World world, UUID key) {
cachedSigns.putIfAbsent(world, new HashMap<>()); signCacheManager.removeWarp(world, key);
cachedSigns.get(world).remove(key); }
public void saveCache() {
signCacheManager.saveCache();
} }
} }

View File

@ -47,6 +47,7 @@ import world.bentobox.warps.objects.WarpsData;
*/ */
public class WarpSignsManager { public class WarpSignsManager {
private static final int MAX_WARPS = 600; private static final int MAX_WARPS = 600;
private static final String WARPS = "warps";
private BentoBox plugin; private BentoBox plugin;
// Map of all warps stored as player, warp sign Location // Map of all warps stored as player, warp sign Location
private Map<World, Map<UUID, Location>> worldsWarpList; private Map<World, Map<UUID, Location>> worldsWarpList;
@ -74,7 +75,7 @@ public class WarpSignsManager {
this.addon = addon; this.addon = addon;
this.plugin = plugin; this.plugin = plugin;
// Set up the database handler // Set up the database handler
// Note that these are saved by the BSkyBlock database // Note that these are saved by the BentoBox database
handler = new Database<>(addon, WarpsData.class); handler = new Database<>(addon, WarpsData.class);
// Load the warps // Load the warps
loadWarpList(); loadWarpList();
@ -176,11 +177,11 @@ public class WarpSignsManager {
/** /**
* Load the warps and check if they still exist * Load the warps and check if they still exist
*/ */
private void loadWarpList() { void loadWarpList() {
addon.getLogger().info("Loading warps..."); addon.log("Loading warps...");
worldsWarpList = new HashMap<>(); worldsWarpList = new HashMap<>();
if (handler.objectExists("warps")) { if (handler.objectExists(WARPS)) {
warpsData = handler.loadObject("warps"); warpsData = handler.loadObject(WARPS);
// Load into map // Load into map
if (warpsData != null) { if (warpsData != null) {
warpsData.getWarpSigns().forEach((k,v) -> { warpsData.getWarpSigns().forEach((k,v) -> {
@ -189,6 +190,8 @@ public class WarpSignsManager {
getWarpMap(k.getWorld()).put(v, k); getWarpMap(k.getWorld()).put(v, k);
} }
}); });
} else {
warpsData = new WarpsData();
} }
} }
} }
@ -263,7 +266,7 @@ public class WarpSignsManager {
* @return Sign's content and type * @return Sign's content and type
*/ */
@NonNull @NonNull
public SignCache getSignInfo(@NonNull World world, @NonNull UUID uuid) { public SignCacheItem getSignInfo(@NonNull World world, @NonNull UUID uuid) {
List<String> result = new ArrayList<>(); List<String> result = new ArrayList<>();
//get the sign info //get the sign info
Location signLocation = getWarp(world, uuid); Location signLocation = getWarp(world, uuid);
@ -297,14 +300,14 @@ public class WarpSignsManager {
} }
if (icon == null || icon.name().contains("SIGN")) { if (icon == null || icon.name().contains("SIGN")) {
return new SignCache(result, Material.valueOf(sign.getType().name().replace("WALL_", ""))); return new SignCacheItem(result, Material.valueOf(sign.getType().name().replace("WALL_", "")));
} else { } else {
return new SignCache(result, icon); return new SignCacheItem(result, icon);
} }
} else { } else {
addon.getWarpSignsManager().removeWarp(world, uuid); addon.getWarpSignsManager().removeWarp(world, uuid);
} }
return new SignCache(Collections.emptyList(), Material.AIR); return new SignCacheItem(Collections.emptyList(), Material.AIR);
} }
/** /**

View File

@ -9,6 +9,7 @@ import java.util.stream.Collectors;
import org.bukkit.World; import org.bukkit.World;
import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.commands.DelayedTeleportCommand;
import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.api.user.User;
import world.bentobox.warps.Warp; import world.bentobox.warps.Warp;
@ -18,7 +19,7 @@ import world.bentobox.warps.Warp;
* @author tastybento * @author tastybento
* *
*/ */
public class WarpCommand extends CompositeCommand { public class WarpCommand extends DelayedTeleportCommand {
private Warp addon; private Warp addon;
@ -28,7 +29,7 @@ public class WarpCommand extends CompositeCommand {
} }
public WarpCommand(Warp addon) { public WarpCommand(Warp addon) {
super(addon.getSettings().getWarpCommand()); super(addon, addon.getSettings().getWarpCommand());
this.addon = addon; this.addon = addon;
} }
@ -59,7 +60,7 @@ public class WarpCommand extends CompositeCommand {
return false; return false;
} else { } else {
// Warp exists! // Warp exists!
addon.getWarpSignsManager().warpPlayer(world, user, foundWarp); this.delayCommand(user, () -> addon.getWarpSignsManager().warpPlayer(world, user, foundWarp));
return true; return true;
} }
} }

View File

@ -1,4 +1,4 @@
package world.bentobox.warps; package world.bentobox.warps.listeners;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -17,8 +17,11 @@ import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.block.SignChangeEvent;
import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.events.team.TeamEvent.TeamKickEvent;
import world.bentobox.bentobox.api.events.team.TeamEvent.TeamLeaveEvent;
import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.util.Util; import world.bentobox.bentobox.util.Util;
import world.bentobox.warps.Warp;
import world.bentobox.warps.event.WarpRemoveEvent; import world.bentobox.warps.event.WarpRemoveEvent;
/** /**
@ -41,6 +44,20 @@ public class WarpSignsListener implements Listener {
this.plugin = addon.getPlugin(); this.plugin = addon.getPlugin();
} }
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onPlayerLeave(TeamLeaveEvent e) {
// Remove any warp signs from this game mode
addon.getWarpSignsManager().removeWarp(e.getIsland().getWorld(), e.getPlayerUUID());
User.getInstance(e.getPlayerUUID()).sendMessage("warps.deactivate");
}
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onPlayerLeave(TeamKickEvent e) {
// Remove any warp signs from this game mode
addon.getWarpSignsManager().removeWarp(e.getIsland().getWorld(), e.getPlayerUUID());
User.getInstance(e.getPlayerUUID()).sendMessage("warps.deactivate");
}
/** /**
* Checks to see if a sign has been broken * Checks to see if a sign has been broken
* @param e - event * @param e - event

View File

@ -0,0 +1,54 @@
package world.bentobox.warps.objects;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.bukkit.World;
import com.google.gson.annotations.Expose;
import world.bentobox.bentobox.database.objects.DataObject;
import world.bentobox.warps.SignCacheItem;
public class SignCache implements DataObject {
@Expose
private String uniqueId = "";
@Expose
private Map<UUID, SignCacheItem> signs = new HashMap<>();
public SignCache() {
// Required by YAML database
}
public SignCache(World w, Map<UUID, SignCacheItem> m) {
this.uniqueId = w.getName();
this.signs = m;
}
@Override
public String getUniqueId() {
return uniqueId;
}
@Override
public void setUniqueId(String uniqueId) {
this.uniqueId = uniqueId;
}
/**
* @return the signs
*/
public Map<UUID, SignCacheItem> getSigns() {
return signs;
}
/**
* @param signs the signs to set
*/
public void setSigns(Map<UUID, SignCacheItem> signs) {
this.signs = signs;
}
}

View File

@ -39,5 +39,5 @@ random-allowed: true
allow-in-other-worlds: false allow-in-other-worlds: false
# #
# Warp and warps commands. You can change them if they clash with other addons or plugins. # Warp and warps commands. You can change them if they clash with other addons or plugins.
warp-command: wwarp warp-command: warp
warps-command: wwarps warps-command: warps

View File

@ -0,0 +1,35 @@
###########################################################################################
# This is a YML file. Be careful when editing. Check your edits in a YAML checker like #
# the one at http://yaml-online-parser.appspot.com #
# #
# Translation by: CZghost #
###########################################################################################
warp:
help:
description: "Teleportovat se na warp ceduli hráče"
parameters: <player name>
warps:
deactivate: "&c Stará warp cedule deaktivována!"
error:
does-not-exist: "&c Sakra! Tento warp již neexistuje!"
no-permission: "&c Na toto nemáš oprávnění!"
no-remove: "&c Nemůžeš odstranit tuto ceduli!"
no-warps-yet: "&c Nejsou k dispozici žádné warpy"
not-enough-level: "&c Úroveň tvého ostrova není dostatečně vysoká!"
not-on-island: "&c K tomuto musíš být na svém ostrově!"
not-safe: "&c Tento warp není bezpečný!"
your-level-is: "&c Úroveň tvého ostrova je jen [level], musí být vyšší než [required]. Spusť příkaz pro úroveň."
help:
description: "otevřít panel warpů"
next: "&6 Další stránka"
player-warped: "&2 [name] se teleportoval na tvou warp ceduli!"
previous: "&6 Předchozí stránka"
random: "&4 Náhodný warp"
sign-removed: "&c Warp cedule odstraněna!"
success: "&a Úspěch!"
title: "Warp cedule"
warpTip: "&6 Polož warp ceduli s [text] na vrchu"
warpToPlayersSign: "&6 Teleportuji tě na ceduli [player]"

View File

@ -11,11 +11,11 @@ warps:
deactivate: "&cRégi teleport tábla deaktiválva!" deactivate: "&cRégi teleport tábla deaktiválva!"
error: error:
does-not-exist: "&cAjjaj! Ez a teleport nem létezik!" does-not-exist: "&cAjjaj! Ez a teleport nem létezik!"
no-permission: "&CNincs jogod ehhez!" no-permission: "&cNincs jogod ehhez!"
no-remove: "&CNem törölheted ezt a táblát!" no-remove: "&cNem törölheted ezt a táblát!"
no-warps-yet: "&CJelenleg nem érhetőek el teleportok" no-warps-yet: "&cJelenleg nem érhetőek el teleportok"
not-enough-level: "&CA szigeted szintje nem elég magas!" not-enough-level: "&cA szigeted szintje nem elég magas!"
not-on-island: "&CEhhez szigeten kell lenned!" not-on-island: "&cEhhez szigeten kell lenned!"
not-safe: "&cEz a teleport nem biztonságos!" not-safe: "&cEz a teleport nem biztonságos!"
your-level-is: "&cJelenleg a sziget szinted [level], és nagyobbnak kell lennie, mint [required]." your-level-is: "&cJelenleg a sziget szinted [level], és nagyobbnak kell lennie, mint [required]."
help: help:
@ -24,8 +24,8 @@ warps:
player-warped: "&2[name] teleportált a teleport tábládhoz!" player-warped: "&2[name] teleportált a teleport tábládhoz!"
previous: "&6Előző oldal" previous: "&6Előző oldal"
random: "&4Véletlenszerű Teleport" random: "&4Véletlenszerű Teleport"
sign-removed: "&CTeleport tábla törölve!" sign-removed: "&cTeleport tábla törölve!"
success: "&ASikeres!" success: "&aSikeres!"
title: "Teleport Táblák" title: "Teleport Táblák"
warpTip: "&6Helyezz le egy teleport táblát a következő szöveggel [text] a tetején" warpTip: "&6Helyezz le egy teleport táblát a következő szöveggel [text] a tetején"
warpToPlayersSign: "&6Teleportálás [player] táblájához" warpToPlayersSign: "&6Teleportálás [player] táblájához"

View File

@ -4,25 +4,25 @@ warp:
description: pārvietoties pie spēlētāja uzaicinājuma zīmes description: pārvietoties pie spēlētāja uzaicinājuma zīmes
parameters: "<spēlētāja vārds>" parameters: "<spēlētāja vārds>"
warps: warps:
deactivate: "&cIepriekšējā uzaicinājumu zīme ir deaktivizēta!"
error:
does-not-exist: "&cAk vai! Uzaicinājuma zīme vairāk neeksistē!"
no-permission: "&CTev nav nepieciešamās atļaujas, lai veiktu darbību!"
no-remove: "&CTu nevari noņemt šo zīmi!"
not-enough-level: "&CTavas salas līmenis ir pārāk zems!"
not-on-island: "&CTev ir jāatrodas uz savas salas, lai veiktu šo darbību!"
not-safe: "&cŠī uzaicinājuma zīme nav droša!"
no-warps-yet: "&CNav neviena aktīva uzaicinājuma zīme."
your-level-is: "&cTavas salas līmenis ir tikai [level], bet ir nepieciešams vismaz
[required]. Vari mēģināt pārrēķināt savas salas līmeni."
help: help:
description: atver uzaicinājumu zīmju sarakstu description: atver uzaicinājumu zīmju sarakstu
next: "&6Nākošā lapa"
player-warped: "&2[name] pārvietotojās pie tavas uzaicinājuma zīmes!"
previous: "&6Iepriekšējā lapa"
sign-removed: "&CUzaicinājuma zīme noņemta!"
success: "&AVeiksmīgi!"
title: Uzaicinājuma Zīmes title: Uzaicinājuma Zīmes
warpTip: "&6Novieto zīmi ar tekstu [text] pirmajā rindā" deactivate: "&c Iepriekšēja uzaicinājuma zīme deaktivizēta!"
warpToPlayersSign: "&6Pārvietojās uz [player] uzaicinājuma zīmes" error:
random: "&4Nejauša Zīmes Izvēle" does-not-exist: "&c Oh! Šī uzaicinājuma zīme vairs neeksistē!"
no-permission: "&c Tev nav atļaujas veikt šo darbību!"
no-remove: "&c Tu nevari noņemt šo zīmi!"
no-warps-yet: "&c Diemžēl neviens uzaicinājums nav pieejams."
not-enough-level: "&c Tavs salas līmenis nav pietiekošs."
not-on-island: "&c Tev ir jābūt uz savas salas, lai veiktu šo darbību!"
not-safe: "&c Šīs uzaicinājums nav drošs!"
your-level-is: "&c Tavas salas līmenis ir [level], bet ir nepieciešams vismaz
[required]. Mēģini pārrēķināt salas līmeni."
next: "&6 Nākošā lapa"
player-warped: "&2 [name] ieradās pie uzaicinājuma zīmes!"
previous: "&6 Iepriekšējā lapa"
random: "&4 Nejaušs uzaicinājums"
sign-removed: "&c Uzaicinājuma zīme noņemta!"
success: "&a Izdevās!"
warpTip: "&6 Izveido zīmi ar [text] pirmajā rindā"
warpToPlayersSign: "&6 Pārvietojas uz [player] uzaicinājuma zīmi."

View File

@ -4,24 +4,24 @@ warp:
description: 传送到该玩家的传送木牌处 description: 传送到该玩家的传送木牌处
parameters: "<player name>" parameters: "<player name>"
warps: warps:
error:
no-permission: "&C权限不足!"
no-remove: "&C无权移除传送木牌!"
not-enough-level: "&C岛屿等级不够高!"
no-warps-yet: "&C暂无可用传送木牌"
your-level-is: "&c岛屿当前等级 [level], 需要等级 [required]"
does-not-exist: "&c那个传送已经不存在了"
not-on-island: "&C操作必须在你的岛屿上进行!"
not-safe: "&c那个传送不安全"
help: help:
description: 打开传送面板 description: 打开传送面板
next: "&6下一页"
previous: "&6上一页"
sign-removed: "&C传送木牌已移除!"
success: "&A成功!"
title: 传送木牌 title: 传送木牌
warpTip: "&6放置一个第一行是 [text] 的木牌以创建传送木牌" deactivate: "&c 旧传送牌已停用!"
warpToPlayersSign: "&6正传送到 [player] 的传送木牌" error:
deactivate: "&c旧传送牌已不再使用" does-not-exist: "&c 哦不!那个传送点已经没了!"
player-warped: "&2[name] 刚刚传送到了你的传送牌!" no-permission: "&c 你无权那样做!"
random: "&4随机传送" no-remove: "&c 你拿不掉那个牌子的!"
no-warps-yet: "&c 暂无可用传送点"
not-enough-level: "&c 你的岛等级不够高!"
not-on-island: "&c 你得在自己的岛屿上操作!"
not-safe: "&c 目标传送点不安全!"
your-level-is: "&c 你的岛现在 [level] 级,需要 [required] 级。 试试岛屿等级命令吧。"
next: "&6 次页"
player-warped: "&2 [name] 传送到了你的传送牌!"
previous: "&6 前页"
random: "&4 随机传送"
sign-removed: "&c 拆掉传送牌了!"
success: "&a 成了!"
warpTip: "&6 放个牌子第一行写 [text]"
warpToPlayersSign: "&6 正传送到 [player] 的牌子"

View File

@ -24,6 +24,7 @@ import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -37,6 +38,8 @@ import org.powermock.modules.junit4.PowerMockRunner;
import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.AbstractDatabaseHandler;
import world.bentobox.bentobox.database.DatabaseSetup;
import world.bentobox.bentobox.managers.PlayersManager; import world.bentobox.bentobox.managers.PlayersManager;
import world.bentobox.warps.config.Settings; import world.bentobox.warps.config.Settings;
@ -45,7 +48,7 @@ import world.bentobox.warps.config.Settings;
* *
*/ */
@RunWith(PowerMockRunner.class) @RunWith(PowerMockRunner.class)
@PrepareForTest({Bukkit.class}) @PrepareForTest({Bukkit.class, DatabaseSetup.class})
public class WarpPanelManagerTest { public class WarpPanelManagerTest {
@Mock @Mock
@ -63,6 +66,20 @@ public class WarpPanelManagerTest {
private UUID uuid; private UUID uuid;
@Mock @Mock
private Settings settings; private Settings settings;
@Mock
private static AbstractDatabaseHandler<Object> handler;
@SuppressWarnings("unchecked")
@BeforeClass
public static void beforeClass() {
// This has to be done beforeClass otherwise the tests will interfere with each other
handler = mock(AbstractDatabaseHandler.class);
// Database
PowerMockito.mockStatic(DatabaseSetup.class);
DatabaseSetup dbSetup = mock(DatabaseSetup.class);
when(DatabaseSetup.getDatabase()).thenReturn(dbSetup);
when(dbSetup.getHandler(any())).thenReturn(handler);
}
/** /**
* @throws java.lang.Exception * @throws java.lang.Exception
@ -127,7 +144,7 @@ public class WarpPanelManagerTest {
when(wsm.getWarp(any(), any())).thenReturn(location); when(wsm.getWarp(any(), any())).thenReturn(location);
// Sign cache // Sign cache
SignCache sc = mock(SignCache.class); SignCacheItem sc = mock(SignCacheItem.class);
when(sc.getSignText()).thenReturn(Collections.singletonList("[welcome]")); when(sc.getSignText()).thenReturn(Collections.singletonList("[welcome]"));
when(sc.getType()).thenReturn(sign_type); when(sc.getType()).thenReturn(sign_type);
when(wsm.getSignInfo(any(), any())).thenReturn(sc); when(wsm.getSignInfo(any(), any())).thenReturn(sc);

View File

@ -9,6 +9,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -211,10 +212,7 @@ public class WarpSignsManagerTest {
// WarpPanelManager // WarpPanelManager
when(addon.getWarpPanelManager()).thenReturn(wpm); when(addon.getWarpPanelManager()).thenReturn(wpm);
// User
wsm = new WarpSignsManager(addon, plugin); wsm = new WarpSignsManager(addon, plugin);
} }
@ -292,7 +290,7 @@ public class WarpSignsManagerTest {
*/ */
@Test @Test
public void testWarpSignsManager() throws Exception { public void testWarpSignsManager() throws Exception {
verify(logger).info("Loading warps..."); verify(addon).log("Loading warps...");
verify(load).getWarpSigns(); verify(load).getWarpSigns();
verify(block).getType(); verify(block).getType();
} }
@ -417,7 +415,7 @@ public class WarpSignsManagerTest {
*/ */
@Test @Test
public void testGetSignInfo() { public void testGetSignInfo() {
SignCache sc = wsm.getSignInfo(world, uuid); SignCacheItem sc = wsm.getSignInfo(world, uuid);
assertEquals(Material.ACACIA_SIGN, sc.getType()); assertEquals(Material.ACACIA_SIGN, sc.getType());
} }
@ -447,4 +445,34 @@ public class WarpSignsManagerTest {
assertFalse(wsm.hasWarp(world, UUID.randomUUID())); assertFalse(wsm.hasWarp(world, UUID.randomUUID()));
} }
/**
* Test method for {@link world.bentobox.warps.WarpSignsManager#loadWarpList()}.
*/
@Test
public void testLoadWarpListNoWarpTable() {
// Run again but with no database table
when(handler.objectExists(anyString())).thenReturn(false);
wsm = new WarpSignsManager(addon, plugin);
// Save
wsm.saveWarpList();
// Default load in constructor check
verify(addon, times(2)).log(eq("Loading warps..."));
assertTrue(wsm.getWarpMap(world).isEmpty());
}
/**
* Test method for {@link world.bentobox.warps.WarpSignsManager#loadWarpList()}.
* @throws Exception
*/
@Test
public void testLoadWarpListEmptyWarpTable() throws Exception {
// Run again but with no data in table
when(handler.loadObject(anyString())).thenReturn(null);
wsm = new WarpSignsManager(addon, plugin);
// Save
wsm.saveWarpList();
// Default load in constructor check
verify(addon, times(2)).log(eq("Loading warps..."));
assertTrue(wsm.getWarpMap(world).isEmpty());
}
} }

View File

@ -17,11 +17,16 @@ import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.plugin.PluginManager;
import org.bukkit.scheduler.BukkitScheduler;
import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.NonNull;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox; import org.powermock.reflect.Whitebox;
@ -65,6 +70,12 @@ public class WarpCommandTest {
private WarpSignsManager wsm; private WarpSignsManager wsm;
@Mock @Mock
private PlayersManager pm; private PlayersManager pm;
@Mock
private PluginManager pim;
@Mock
private world.bentobox.bentobox.Settings s;
@Mock
private BukkitScheduler sch;
/** /**
* @throws java.lang.Exception * @throws java.lang.Exception
@ -112,6 +123,20 @@ public class WarpCommandTest {
when(addon.getPlayers()).thenReturn(pm); when(addon.getPlayers()).thenReturn(pm);
// Repeat twice because it is asked twice // Repeat twice because it is asked twice
when(pm.getName(any())).thenReturn("tastybento", "tastybento", "poslovich", "poslovich", "BONNe", "BONNe", "Joe"); when(pm.getName(any())).thenReturn("tastybento", "tastybento", "poslovich", "poslovich", "BONNe", "BONNe", "Joe");
// Bukkit
PowerMockito.mockStatic(Bukkit.class);
when(Bukkit.getPluginManager()).thenReturn(pim);
when(Bukkit.getScheduler()).thenReturn(sch);
// BentoBox settings
when(plugin.getSettings()).thenReturn(s);
when(s.getDelayTime()).thenReturn(0);
}
@After
public void tearDown() {
Mockito.framework().clearInlineMocks();
} }
public void warpCommandWarpCompositeCommand() { public void warpCommandWarpCompositeCommand() {
@ -124,6 +149,7 @@ public class WarpCommandTest {
wc = new WarpCommand(addon); wc = new WarpCommand(addon);
} }
/** /**
* Test method for {@link world.bentobox.warps.commands.WarpCommand#setup()}. * Test method for {@link world.bentobox.warps.commands.WarpCommand#setup()}.
*/ */
@ -165,7 +191,7 @@ public class WarpCommandTest {
public void testExecuteUserStringListOfStringKnownPlayer() { public void testExecuteUserStringListOfStringKnownPlayer() {
warpCommandWarpCompositeCommand(); warpCommandWarpCompositeCommand();
assertTrue(wc.execute(user, "warp", Collections.singletonList("tastybento"))); assertTrue(wc.execute(user, "warp", Collections.singletonList("tastybento")));
verify(wsm).warpPlayer(eq(world), eq(user), any()); //verify(wsm).warpPlayer(eq(world), eq(user), any());
} }
/** /**
@ -175,7 +201,7 @@ public class WarpCommandTest {
public void testExecuteUserStringListOfStringKnownPlayerWarp() { public void testExecuteUserStringListOfStringKnownPlayerWarp() {
warpCommandWarp(); warpCommandWarp();
assertTrue(wc.execute(user, "warp", Collections.singletonList("tastybento"))); assertTrue(wc.execute(user, "warp", Collections.singletonList("tastybento")));
verify(wsm).warpPlayer(eq(world), eq(user), any()); //verify(wsm).warpPlayer(eq(world), eq(user), any());
} }
/** /**
@ -185,7 +211,7 @@ public class WarpCommandTest {
public void testExecuteUserStringListOfStringKnownPlayerMixedCase() { public void testExecuteUserStringListOfStringKnownPlayerMixedCase() {
warpCommandWarpCompositeCommand(); warpCommandWarpCompositeCommand();
assertTrue(wc.execute(user, "warp", Collections.singletonList("tAsTyBEnTo"))); assertTrue(wc.execute(user, "warp", Collections.singletonList("tAsTyBEnTo")));
verify(wsm).warpPlayer(eq(world), eq(user), any()); //verify(wsm).warpPlayer(eq(world), eq(user), any());
} }
/** /**
@ -195,7 +221,7 @@ public class WarpCommandTest {
public void testExecuteUserStringListOfStringKnownPlayerStartOnly() { public void testExecuteUserStringListOfStringKnownPlayerStartOnly() {
warpCommandWarpCompositeCommand(); warpCommandWarpCompositeCommand();
assertTrue(wc.execute(user, "warp", Collections.singletonList("tAsTy"))); assertTrue(wc.execute(user, "warp", Collections.singletonList("tAsTy")));
verify(wsm).warpPlayer(eq(world), eq(user), any()); //verify(wsm).warpPlayer(eq(world), eq(user), any());
} }

View File

@ -1,4 +1,4 @@
package world.bentobox.warps; package world.bentobox.warps.listeners;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
@ -50,7 +50,10 @@ import world.bentobox.bentobox.managers.IslandsManager;
import world.bentobox.bentobox.managers.LocalesManager; import world.bentobox.bentobox.managers.LocalesManager;
import world.bentobox.bentobox.managers.PlaceholdersManager; import world.bentobox.bentobox.managers.PlaceholdersManager;
import world.bentobox.bentobox.util.Util; import world.bentobox.bentobox.util.Util;
import world.bentobox.warps.Warp;
import world.bentobox.warps.WarpSignsManager;
import world.bentobox.warps.config.Settings; import world.bentobox.warps.config.Settings;
import world.bentobox.warps.listeners.WarpSignsListener;
/** /**
* @author tastybento * @author tastybento