1
mirror of https://github.com/CarmJos/MoeTeleport.git synced 2026-06-05 00:28:16 +08:00

5 Commits

Author SHA1 Message Date
carm affdb47034 1.0.3 版本更新
1. [F] 修复传送点异常的问题。
2021-12-17 13:33:21 +08:00
carm 5439c57dde 1.0.2 版本更新
1. 修复back有时无法使用的问题
2. 添加权限节点的前缀,避免权限混用
3. 实装多条请求处理的提示
4. 针对home和back取消safety判断,避免无法返回。
5. 修复请求超时不清理的问题。
6. 修复部分消息不全的问题。
7. 添加Tpa/TpaHere的限制,短时间只允许一条请求,避免刷屏。
2021-12-17 13:29:12 +08:00
carm 98a88356d8 判断时添加权限节点前缀 2021-12-17 11:09:30 +08:00
carm a8f9c2eee8 判断时添加权限节点前缀 2021-12-17 11:08:25 +08:00
carm c888846531 判断时添加权限节点前缀 2021-12-17 11:08:17 +08:00
19 changed files with 149 additions and 176 deletions
+1 -1
View File
@@ -13,7 +13,7 @@
<groupId>cc.carm.plugin</groupId> <groupId>cc.carm.plugin</groupId>
<artifactId>moeteleport</artifactId> <artifactId>moeteleport</artifactId>
<version>1.0.0</version> <version>1.0.3</version>
<name>MoeTeleport</name> <name>MoeTeleport</name>
<description>喵喵传送,简单的传送、设置家的插件。</description> <description>喵喵传送,简单的传送、设置家的插件。</description>
@@ -4,8 +4,12 @@ import cc.carm.plugin.moeteleport.command.BackCommand;
import cc.carm.plugin.moeteleport.command.completer.HomeNameCompleter; import cc.carm.plugin.moeteleport.command.completer.HomeNameCompleter;
import cc.carm.plugin.moeteleport.command.completer.PlayerNameCompleter; import cc.carm.plugin.moeteleport.command.completer.PlayerNameCompleter;
import cc.carm.plugin.moeteleport.command.completer.TpRequestCompleter; import cc.carm.plugin.moeteleport.command.completer.TpRequestCompleter;
import cc.carm.plugin.moeteleport.command.home.*; import cc.carm.plugin.moeteleport.command.home.DelHomeCommand;
import cc.carm.plugin.moeteleport.command.tpa.*; import cc.carm.plugin.moeteleport.command.home.GoHomeCommand;
import cc.carm.plugin.moeteleport.command.home.ListHomeCommand;
import cc.carm.plugin.moeteleport.command.home.SetHomeCommand;
import cc.carm.plugin.moeteleport.command.tpa.TpHandleCommand;
import cc.carm.plugin.moeteleport.command.tpa.TpaCommand;
import cc.carm.plugin.moeteleport.listener.UserListener; import cc.carm.plugin.moeteleport.listener.UserListener;
import cc.carm.plugin.moeteleport.manager.ConfigManager; import cc.carm.plugin.moeteleport.manager.ConfigManager;
import cc.carm.plugin.moeteleport.manager.RequestManager; import cc.carm.plugin.moeteleport.manager.RequestManager;
@@ -57,9 +61,9 @@ public class Main extends JavaPlugin {
registerCommand("listHome", new ListHomeCommand()); registerCommand("listHome", new ListHomeCommand());
registerCommand("tpa", new TpaCommand(), new PlayerNameCompleter()); registerCommand("tpa", new TpaCommand(), new PlayerNameCompleter());
registerCommand("tpaHere", new TpaHereCommand(), new PlayerNameCompleter()); registerCommand("tpaHere", new TpaCommand(), new PlayerNameCompleter());
registerCommand("tpAccept", new TpAcceptCommand(), new TpRequestCompleter()); registerCommand("tpAccept", new TpHandleCommand(), new TpRequestCompleter());
registerCommand("tpDeny", new TpDenyCommand(), new TpRequestCompleter()); registerCommand("tpDeny", new TpHandleCommand(), new TpRequestCompleter());
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。"); log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
@@ -21,13 +21,7 @@ public class BackCommand implements CommandExecutor {
PluginMessages.NO_LAST_LOCATION.send(player); PluginMessages.NO_LAST_LOCATION.send(player);
return true; return true;
} }
if (!TeleportManager.isSafeLocation(data.getLastLocation())) { TeleportManager.teleport(player, data.getLastLocation(), false);
PluginMessages.DANGEROUS.send(player);
return true;
}
TeleportManager.teleport(player, data.getLastLocation());
return true; return true;
} }
@@ -29,7 +29,7 @@ public class DelHomeCommand implements CommandExecutor {
} else { } else {
PluginMessages.Home.REMOVED.sendWithPlaceholders(player, PluginMessages.Home.REMOVED.sendWithPlaceholders(player,
new String[]{"%(name)", "%(location)"}, new String[]{"%(name)", "%(location)"},
new Object[]{locationInfo.getKey(), locationInfo.getValue().toString()}); new Object[]{locationInfo.getKey(), locationInfo.getValue().toFlatString()});
data.delHomeLocation(homeName); data.delHomeLocation(homeName);
} }
return true; return true;
@@ -26,7 +26,7 @@ public class GoHomeCommand implements CommandExecutor {
if (locationInfo == null) { if (locationInfo == null) {
PluginMessages.Home.NOT_FOUND.sendWithPlaceholders(player); PluginMessages.Home.NOT_FOUND.sendWithPlaceholders(player);
} else { } else {
TeleportManager.teleport(player, locationInfo.getValue()); TeleportManager.teleport(player, locationInfo.getValue(), false);
} }
return true; return true;
} }
@@ -20,8 +20,8 @@ public class ListHomeCommand implements CommandExecutor {
PluginMessages.Home.HEADER.sendWithPlaceholders(player); PluginMessages.Home.HEADER.sendWithPlaceholders(player);
data.getHomeLocations().forEach((name, loc) -> PluginMessages.Home.LIST_OBJECT data.getHomeLocations().forEach((name, loc) -> PluginMessages.Home.LIST_OBJECT
.sendWithPlaceholders(player, .sendWithPlaceholders(player,
new String[]{"%(name)", "%(location)"}, new String[]{"%(id)", "%(location)"},
new Object[]{name, loc.toString()} new Object[]{name, loc.toFlatString()}
)); ));
return true; return true;
} }
@@ -1,47 +0,0 @@
package cc.carm.plugin.moeteleport.command.tpa;
import cc.carm.plugin.moeteleport.Main;
import cc.carm.plugin.moeteleport.configuration.PluginMessages;
import cc.carm.plugin.moeteleport.model.TeleportRequest;
import cc.carm.plugin.moeteleport.model.UserData;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Comparator;
public class TpDenyCommand implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player)) return false;
Player player = (Player) sender;
UserData data = Main.getUserManager().getData(player);
if (data.getReceivedRequests().isEmpty()) {
PluginMessages.Request.NOT_FOUND.sendWithPlaceholders(player);
return true;
}
String targetName = args.length > 0 ? args[0] : null;
if (targetName != null) {
Player target = Bukkit.getPlayer(targetName);
if (target == null || !data.getReceivedRequests().containsKey(target.getUniqueId())) {
PluginMessages.Request.NOT_FOUND_PLAYER.sendWithPlaceholders(player,
new String[]{"%(player)"},
new Object[]{target == null ? targetName : target.getName()}
);
} else {
TeleportRequest request = data.getReceivedRequests().get(target.getUniqueId());
Main.getRequestManager().denyRequest(request); // 交给Manager处理
}
} else {
data.getReceivedRequests().values().stream()
.min(Comparator.comparingLong(TeleportRequest::getActiveTime))
.ifPresent(request -> Main.getRequestManager().denyRequest(request));
}
return true;
}
}
@@ -13,10 +13,11 @@ import org.jetbrains.annotations.NotNull;
import java.util.Comparator; import java.util.Comparator;
public class TpAcceptCommand implements CommandExecutor { public class TpHandleCommand implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player)) return false; if (!(sender instanceof Player)) return false;
Player player = (Player) sender; Player player = (Player) sender;
UserData data = Main.getUserManager().getData(player); UserData data = Main.getUserManager().getData(player);
@@ -25,6 +26,8 @@ public class TpAcceptCommand implements CommandExecutor {
return true; return true;
} }
String targetName = args.length > 0 ? args[0] : null; String targetName = args.length > 0 ? args[0] : null;
boolean accept = command.getName().equalsIgnoreCase("tpAccept");
data.setEnableAutoSelect(false);
if (targetName != null) { if (targetName != null) {
Player target = Bukkit.getPlayer(targetName); Player target = Bukkit.getPlayer(targetName);
if (target == null || !data.getReceivedRequests().containsKey(target.getUniqueId())) { if (target == null || !data.getReceivedRequests().containsKey(target.getUniqueId())) {
@@ -33,15 +36,30 @@ public class TpAcceptCommand implements CommandExecutor {
new Object[]{target == null ? targetName : target.getName()} new Object[]{target == null ? targetName : target.getName()}
); );
} else { } else {
TeleportRequest request = data.getReceivedRequests().get(target.getUniqueId()); handle(data.getReceivedRequests().get(target.getUniqueId()), accept); // 交给Manager处理
Main.getRequestManager().acceptRequest(request); // 交给Manager处理
} }
} else { } else {
data.getReceivedRequests().values().stream() if (data.getReceivedRequests().size() == 1 || data.isEnableAutoSelect()) {
.min(Comparator.comparingLong(TeleportRequest::getActiveTime)) data.getReceivedRequests().values().stream()
.ifPresent(request -> Main.getRequestManager().acceptRequest(request)); .min(Comparator.comparingLong(TeleportRequest::getActiveTime))
.ifPresent(request -> handle(request, accept));
} else {
PluginMessages.Request.MULTI.sendWithPlaceholders(player,
new String[]{"%(num)", "%(command)"},
new Object[]{data.getReceivedRequests().size(), command.getName()}
);
data.setEnableAutoSelect(true);
}
} }
return true; return true;
} }
private void handle(TeleportRequest request, boolean accept) {
if (accept) {
Main.getRequestManager().acceptRequest(request);
} else {
Main.getRequestManager().denyRequest(request);
}
}
} }
@@ -13,7 +13,8 @@ import org.jetbrains.annotations.NotNull;
public class TpaCommand implements CommandExecutor { public class TpaCommand implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player) || args.length < 1) return false; if (!(sender instanceof Player) || args.length < 1) return false;
Player player = (Player) sender; Player player = (Player) sender;
Player target = Bukkit.getPlayer(args[0]); Player target = Bukkit.getPlayer(args[0]);
@@ -21,7 +22,21 @@ public class TpaCommand implements CommandExecutor {
PluginMessages.NOT_ONLINE.sendWithPlaceholders(player); PluginMessages.NOT_ONLINE.sendWithPlaceholders(player);
return true; return true;
} }
Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA);
TeleportRequest request = Main.getUserManager().getData(target).getReceivedRequests().get(player.getUniqueId());
if (request != null) {
PluginMessages.Request.DUPLICATE.sendWithPlaceholders(sender,
new String[]{"%(player)", "%(expire)"},
new Object[]{target.getName(), request.getRemainSeconds()}
);
return true;
}
if (command.getName().equalsIgnoreCase("tpa")) {
Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA);
} else {
Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA_HERE);
}
return true; return true;
} }
@@ -1,28 +0,0 @@
package cc.carm.plugin.moeteleport.command.tpa;
import cc.carm.plugin.moeteleport.Main;
import cc.carm.plugin.moeteleport.configuration.PluginMessages;
import cc.carm.plugin.moeteleport.model.TeleportRequest;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class TpaHereCommand implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player) || args.length < 1) return false;
Player player = (Player) sender;
Player target = Bukkit.getPlayer(args[0]);
if (target == null) {
PluginMessages.NOT_ONLINE.sendWithPlaceholders(player);
return true;
}
Main.getRequestManager().sendRequest(player, target, TeleportRequest.RequestType.TPA_HERE);
return true;
}
}
@@ -25,6 +25,7 @@ public class PluginMessages {
public static final ConfigMessageList NOT_AVAILABLE = new ConfigMessageList("notAvailable"); public static final ConfigMessageList NOT_AVAILABLE = new ConfigMessageList("notAvailable");
public static class Request { public static class Request {
public static final ConfigMessageList DUPLICATE = new ConfigMessageList("request-duplicate");
public static final ConfigMessageList OFFLINE = new ConfigMessageList("offline"); public static final ConfigMessageList OFFLINE = new ConfigMessageList("offline");
public static final ConfigMessageList SENT = new ConfigMessageList("request-sent"); public static final ConfigMessageList SENT = new ConfigMessageList("request-sent");
@@ -8,10 +8,12 @@ import org.bukkit.util.NumberConversions;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.text.DecimalFormat;
import java.util.Objects; import java.util.Objects;
public class DataLocation implements Cloneable { public class DataLocation implements Cloneable {
public static final DecimalFormat format = new DecimalFormat("0.00");
private String worldName; private String worldName;
private double x; private double x;
private double y; private double y;
@@ -97,8 +99,8 @@ public class DataLocation implements Cloneable {
try { try {
return super.clone(); return super.clone();
} catch (Exception ex) { } catch (Exception ex) {
return null;
} }
return null;
} }
@Override @Override
@@ -124,6 +126,10 @@ public class DataLocation implements Cloneable {
return worldName + " " + x + " " + y + " " + z + " " + yaw + " " + pitch; return worldName + " " + x + " " + y + " " + z + " " + yaw + " " + pitch;
} }
public String toFlatString() {
return worldName + "@" + format.format(x) + ", " + format.format(y) + ", " + format.format(z);
}
@Deprecated @Deprecated
public String toSerializedString() { public String toSerializedString() {
return serializeToText(); return serializeToText();
@@ -143,14 +149,14 @@ public class DataLocation implements Cloneable {
if (args.length < 4) return null; if (args.length < 4) return null;
try { try {
String worldName = args[0]; String worldName = args[0];
double x = NumberConversions.toDouble(args[0]); double x = NumberConversions.toDouble(args[1]);
double y = NumberConversions.toDouble(args[1]); double y = NumberConversions.toDouble(args[2]);
double z = NumberConversions.toDouble(args[2]); double z = NumberConversions.toDouble(args[3]);
float yaw = 0; float yaw = 0;
float pitch = 0; float pitch = 0;
if (args.length == 5) { if (args.length == 6) {
yaw = NumberConversions.toFloat(args[3]); yaw = NumberConversions.toFloat(args[4]);
pitch = NumberConversions.toFloat(args[4]); pitch = NumberConversions.toFloat(args[5]);
} }
return new DataLocation(worldName, x, y, z, yaw, pitch); return new DataLocation(worldName, x, y, z, yaw, pitch);
} catch (Exception ex) { } catch (Exception ex) {
@@ -42,7 +42,10 @@ public class RequestManager {
.peek(entry -> PluginMessages.Request.RECEIVED_TIMEOUT.sendWithPlaceholders( .peek(entry -> PluginMessages.Request.RECEIVED_TIMEOUT.sendWithPlaceholders(
entry.getValue().getReceiver(), new String[]{"%(player)"}, entry.getValue().getReceiver(), new String[]{"%(player)"},
new Object[]{entry.getValue().getSender().getName()})) new Object[]{entry.getValue().getSender().getName()}))
.forEach(entry -> data.getSentRequests().remove(entry.getKey())) .peek(entry -> Main.getUserManager()
.getData(entry.getValue().getSender()).getSentRequests()
.remove(entry.getKey()))
.forEach(entry -> data.getReceivedRequests().remove(entry.getKey()))
); );
} }
@@ -51,8 +54,9 @@ public class RequestManager {
PluginMessages.Request.SENT.sendWithPlaceholders(sender, PluginMessages.Request.SENT.sendWithPlaceholders(sender,
new String[]{"%(player)", "%(expire)"}, new String[]{"%(player)", "%(expire)"},
new Object[]{receiver, expireTime} new Object[]{receiver.getName(), expireTime}
); );
switch (type) { switch (type) {
case TPA: { case TPA: {
PluginMessages.TPA.sendWithPlaceholders(receiver, PluginMessages.TPA.sendWithPlaceholders(receiver,
@@ -85,7 +89,7 @@ public class RequestManager {
new String[]{"%(player)"}, new String[]{"%(player)"},
new Object[]{request.getSender().getName()} new Object[]{request.getSender().getName()}
); );
TeleportManager.teleport(request.getTeleportPlayer(), request.getTeleportLocation()); TeleportManager.teleport(request.getTeleportPlayer(), request.getTeleportLocation(), true);
removeRequests(request); removeRequests(request);
} }
@@ -1,5 +1,6 @@
package cc.carm.plugin.moeteleport.manager; package cc.carm.plugin.moeteleport.manager;
import cc.carm.plugin.moeteleport.Main;
import cc.carm.plugin.moeteleport.configuration.PluginConfig; import cc.carm.plugin.moeteleport.configuration.PluginConfig;
import cc.carm.plugin.moeteleport.configuration.PluginMessages; import cc.carm.plugin.moeteleport.configuration.PluginMessages;
import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.configuration.location.DataLocation;
@@ -10,29 +11,34 @@ import org.bukkit.entity.Player;
public class TeleportManager { public class TeleportManager {
public static void teleport(Player player, DataLocation targetLocation) { public static void teleport(Player player, DataLocation targetLocation, boolean onlySafety) {
Location location = targetLocation.getBukkitLocation(); Location location = targetLocation.getBukkitLocation();
if (location == null) { if (location == null) {
PluginMessages.NOT_AVAILABLE.sendWithPlaceholders(player, PluginMessages.NOT_AVAILABLE.sendWithPlaceholders(player,
new String[]{"%(location)"}, new String[]{"%(location)"},
new Object[]{targetLocation.toString()} new Object[]{targetLocation.toFlatString()}
); );
} else { } else {
teleport(player, location); teleport(player, location, onlySafety);
} }
} }
public static void teleport(Player player, Location targetLocation) { public static void teleport(Player player, Location targetLocation, boolean onlySafety) {
if (targetLocation.isWorldLoaded()) { if (targetLocation.isWorldLoaded()) {
player.teleport(targetLocation); if (!onlySafety || TeleportManager.isSafeLocation(targetLocation)) {
PluginMessages.TELEPORTING.sendWithPlaceholders(player, Main.getUserManager().getData(player).setLastLocation(player.getLocation());
new String[]{"%(location)"}, player.teleport(targetLocation);
new Object[]{new DataLocation(targetLocation).toString()} PluginMessages.TELEPORTING.sendWithPlaceholders(player,
); new String[]{"%(location)"},
new Object[]{new DataLocation(targetLocation).toFlatString()}
);
} else {
PluginMessages.DANGEROUS.send(player);
}
} else { } else {
PluginMessages.NOT_AVAILABLE.sendWithPlaceholders(player, PluginMessages.NOT_AVAILABLE.sendWithPlaceholders(player,
new String[]{"%(location)"}, new String[]{"%(location)"},
new Object[]{new DataLocation(targetLocation).toString()} new Object[]{new DataLocation(targetLocation).toFlatString()}
); );
} }
} }
@@ -44,7 +44,9 @@ public class UserManager {
Map<String, Integer> permissions = PluginConfig.PERMISSIONS.get(); Map<String, Integer> permissions = PluginConfig.PERMISSIONS.get();
int value = PluginConfig.DEFAULT_HOME.get(); int value = PluginConfig.DEFAULT_HOME.get();
for (Map.Entry<String, Integer> entry : permissions.entrySet()) { for (Map.Entry<String, Integer> entry : permissions.entrySet()) {
if (entry.getValue() > value && player.hasPermission(entry.getKey())) { if (entry.getValue() > value && player.hasPermission(
Main.getInstance().getName() + "." + entry.getKey()
)) {
value = entry.getValue(); value = entry.getValue();
} }
} }
@@ -1,8 +1,6 @@
package cc.carm.plugin.moeteleport.model; package cc.carm.plugin.moeteleport.model;
import cc.carm.plugin.moeteleport.configuration.PluginConfig; import cc.carm.plugin.moeteleport.configuration.PluginConfig;
import cc.carm.plugin.moeteleport.configuration.PluginMessages;
import cc.carm.plugin.moeteleport.manager.TeleportManager;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -52,25 +50,16 @@ public class TeleportRequest {
return System.currentTimeMillis() - getCreateTime(); return System.currentTimeMillis() - getCreateTime();
} }
public long getRemainTime() {
return PluginConfig.EXPIRE_TIME.get() * 1000 - getActiveTime();
}
/** public long getRemainSeconds() {
* 尝试对玩家进行传送 return getRemainTime() / 1000;
*
* @return 是否传送成功
*/
public boolean tryTeleport(@NotNull Location location) {
if (!location.isWorldLoaded()) return false;
if (!TeleportManager.isSafeLocation(location)) {
PluginMessages.DANGEROUS.sendWithPlaceholders(getTeleportPlayer());
return false;
} else {
TeleportManager.teleport(getTeleportPlayer(), location);
return true;
}
} }
public boolean isExpired() { public boolean isExpired() {
return getActiveTime() > PluginConfig.EXPIRE_TIME.get() * 10000; return getActiveTime() > PluginConfig.EXPIRE_TIME.get() * 1000;
} }
public enum RequestType { public enum RequestType {
@@ -1,12 +1,10 @@
package cc.carm.plugin.moeteleport.model; package cc.carm.plugin.moeteleport.model;
import cc.carm.plugin.moeteleport.Main; import cc.carm.plugin.moeteleport.Main;
import cc.carm.plugin.moeteleport.configuration.PluginConfig;
import cc.carm.plugin.moeteleport.configuration.location.DataLocation; import cc.carm.plugin.moeteleport.configuration.location.DataLocation;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -24,8 +22,10 @@ public class UserData {
private LinkedHashMap<String, DataLocation> homeLocations; private LinkedHashMap<String, DataLocation> homeLocations;
private HashSet<UUID/*receiverUUID*/> sentRequests; // 记录发出的请求 private final HashSet<UUID/*receiverUUID*/> sentRequests = new HashSet<>(); // 记录发出的请求
private ConcurrentHashMap<UUID/*senderUUID*/, TeleportRequest> receivedRequests; // 记录收到的传送请求 private final ConcurrentHashMap<UUID/*senderUUID*/, TeleportRequest> receivedRequests = new ConcurrentHashMap<>(); // 记录收到的传送请求
public boolean enableAutoSelect = false;
public UserData(@NotNull File dataFolder, @NotNull UUID uuid) { public UserData(@NotNull File dataFolder, @NotNull UUID uuid) {
this(new File(dataFolder, uuid + ".yml")); this(new File(dataFolder, uuid + ".yml"));
@@ -88,12 +88,8 @@ public class UserData {
return lastLocation; return lastLocation;
} }
public boolean backToLocation(Player player) { public void setLastLocation(@Nullable Location lastLocation) {
if (getLastLocation() == null) return false; this.lastLocation = lastLocation;
else {
player.teleport(getLastLocation());
return true;
}
} }
public HashSet<UUID> getSentRequests() { public HashSet<UUID> getSentRequests() {
@@ -104,7 +100,13 @@ public class UserData {
return receivedRequests; return receivedRequests;
} }
public void setEnableAutoSelect(boolean enableAutoSelect) {
this.enableAutoSelect = enableAutoSelect;
}
public boolean isEnableAutoSelect() {
return enableAutoSelect;
}
public @NotNull File getDataFile() { public @NotNull File getDataFile() {
return dataFile; return dataFile;
+27 -25
View File
@@ -4,39 +4,41 @@ no-last-location:
not-online: not-online:
- "&f目标玩家并不在线,无法发送请求。" - "&f目标玩家并不在线,无法发送请求。"
tpa: tpa:
- "&6%(player) &f请求传送到您身边,您有%(expire)秒的时间回应。" - "&d%(player) &f请求传送到您身边,您有 &5%(expire)秒 &f的时间回应。"
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。" - "&a&l[同意] &f输入 &5/tpaccept &f同意该请求。"
- "&c&l[拒绝] &f输入 &e/tpdeny &f拒绝该请求。" - "&c&l[拒绝] &f输入 &5/tpdeny &f拒绝该请求。"
tpahere: tpahere:
- "&6%(player) &f请求传送您到Ta身边,您有%(expire)秒的时间回应。" - "&d%(player) &f请求传送您到Ta身边,您有 &5%(expire)秒 &f的时间回应。"
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。" - "&a&l[同意] &f输入 &5/tpaccept &f同意该请求。"
- "&c&l[拒绝] &f输入 &e/tpdeny &f拒绝该请求。" - "&c&l[拒绝] &f输入 &5/tpdeny &f拒绝该请求。"
tpaccept: tpaccept:
- "&f您同意了 &6%(player) &f的传送请求。" - "&f您同意了 &d%(player) &f的传送请求。"
tpdeny: tpdeny:
- "&f您&c拒绝&f了 &6%(player) &f的传送请求。" - "&f您&d拒绝&f了 &d%(player) &f的传送请求。"
accepted: accepted:
- "&6%(player) &f同意了您的传送请求。" - "&d%(player) &f同意了您的传送请求。"
denied: denied:
- "&6%(player) &c拒绝&f了您的传送请求。" - "&d%(player) &f拒绝了您的传送请求。"
offline: offline:
- "&6%(player) &f离线,相关请求已自动取消。" - "&d%(player) &f离线,相关请求已自动取消。"
request-duplicate:
- "&f您已经向 &d%(player) &f发送过传送请求,对方仍有 &5%(expire)秒 &f的时间回应该请求。"
request-sent: request-sent:
- "&f成功向玩家 &6%(player) 发送传送请求,对方有%(expire)秒的时间回应该请求。" - "&f成功向玩家 &d%(player) &f发送传送请求,对方有 &5%(expire)秒 &f的时间回应该请求。"
no-request: no-request:
- "&f您当前没有任何待处理的传送请求。" - "&f您当前没有任何待处理的传送请求。"
no-request-player: no-request-player:
- "&f您当前没有收到来自 &6%(player) &f的传送请求。" - "&f您当前没有收到来自 &d%(player) &f的传送请求。"
multi-requests: multi-requests:
- "&f您当前有条请求待处理,请输入 &6%(command) <玩家名> &f决定回应谁的请求。" - "&f您当前有&d%(num)条请求&f待处理,请输入 &5/%(command) <玩家名> &f决定回应谁的请求。"
- "&f您也可以再次输入 &6%(command) &f直接回应最近的一条请求。" - "&f您也可以再次输入 &5/%(command) &f直接回应最近的一条请求。"
request-sent-timeout: request-sent-timeout:
- "&f发往 &6%(player) &f的传送请求已超时。" - "&f发往 &d%(player) &f的传送请求已超时。"
request-received-timeout: request-received-timeout:
- "&f来自 &6%(player) &f的传送请求已超时。" - "&f来自 &d%(player) &f的传送请求已超时。"
teleporting: teleporting:
- "&f正在传送到 &6%(location) &f..." - "&f正在传送到 &d%(location) &f..."
dangerous: dangerous:
- "&f目标地点不安全,传送被取消。" - "&f目标地点不安全,传送被取消。"
dangerous-here: dangerous-here:
@@ -46,15 +48,15 @@ notAvailable:
home-list-header: home-list-header:
- "&f您当前设定的所有家:" - "&f您当前设定的所有家:"
home-list-object: "&8#&f%(id) &6%(location)" home-list-object: "&8#&f%(id) &d%(location)"
home-not-found: home-not-found:
- "&f您还没有设置这个家,请先输入 &e/setHome <家名称> &f设置一个吧!" - "&f您还没有设置这个家,请先输入 &5/setHome <家名称> &f设置一个吧!"
home-set: home-set:
- "&f成功设定名为 &6%(name) &f的家传送点。" - "&f成功设定名为 &d%(name) &f的家传送点。"
home-removed: home-removed:
- "&f成功移除名为 &6%(name) &f的家传送点。" - "&f成功移除名为 &d%(name) &f的家传送点。"
- "&7原先位置为 &f%(location) &7。" - "&7原先位置为 &f%(location) &7。"
home-over-limit: home-over-limit:
- "&f您最多只能设置 &6%(max) &f个家传送点!" - "&f您最多只能设置 &d%(max) &f个家传送点!"
- "&7可以输入 &e/delHome <家名称> &7删除之前的家传送点," - "&7可以输入 &5/delHome <家名称> &7删除之前的家传送点,"
- "&7或输入 &e/setHome <家名称> &7覆盖之前的家传送点。" - "&7或输入 &5/setHome <家名称> &7覆盖之前的家传送点。"
+7 -2
View File
@@ -8,6 +8,11 @@ description: ${project.description}
softdepend: softdepend:
- PlaceholderAPI - PlaceholderAPI
permissions:
"MoeTeleport":
description: "插件的主权限节点"
default: false
commands: commands:
"back": "back":
description: 返回传送前的上一个地点。 description: 返回传送前的上一个地点。
@@ -18,10 +23,10 @@ commands:
"tpaHere": "tpaHere":
usage: "/tpaHere <玩家>" usage: "/tpaHere <玩家>"
description: 请求一个玩家传送到自己身边。 description: 请求一个玩家传送到自己身边。
"tpaAccept": "tpAccept":
usage: "/tpAccept [玩家]" usage: "/tpAccept [玩家]"
description: 同意一个请求,可以限定某个玩家。 description: 同意一个请求,可以限定某个玩家。
"tpaDeny": "tpDeny":
usage: "/tpDeny [玩家]" usage: "/tpDeny [玩家]"
description: 拒绝一个请求,可以限定某个玩家。 description: 拒绝一个请求,可以限定某个玩家。