mirror of
https://github.com/CarmJos/MoeTeleport.git
synced 2024-09-19 21:35:56 +00:00
完成Home功能
This commit is contained in:
parent
2a4bffff78
commit
106e41492e
@ -1,12 +1,8 @@
|
|||||||
package cc.carm.plugin.moeteleport;
|
package cc.carm.plugin.moeteleport;
|
||||||
|
|
||||||
import cc.carm.plugin.moeteleport.command.BackCommand;
|
import cc.carm.plugin.moeteleport.command.BackCommand;
|
||||||
import cc.carm.plugin.moeteleport.command.tpa.PlayerNameCompleter;
|
|
||||||
import cc.carm.plugin.moeteleport.command.home.*;
|
import cc.carm.plugin.moeteleport.command.home.*;
|
||||||
import cc.carm.plugin.moeteleport.command.tpa.TpAcceptCommand;
|
import cc.carm.plugin.moeteleport.command.tpa.*;
|
||||||
import cc.carm.plugin.moeteleport.command.tpa.TpDenyCommand;
|
|
||||||
import cc.carm.plugin.moeteleport.command.tpa.TpaCommand;
|
|
||||||
import cc.carm.plugin.moeteleport.command.tpa.TpaHereCommand;
|
|
||||||
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;
|
||||||
@ -44,7 +40,7 @@ public class Main extends JavaPlugin {
|
|||||||
this.userManager = new UserManager(this);
|
this.userManager = new UserManager(this);
|
||||||
|
|
||||||
log("加载请求管理器...");
|
log("加载请求管理器...");
|
||||||
this.requestManager = new RequestManager();
|
this.requestManager = new RequestManager(this);
|
||||||
|
|
||||||
log("注册监听器...");
|
log("注册监听器...");
|
||||||
regListener(new UserListener());
|
regListener(new UserListener());
|
||||||
@ -59,8 +55,8 @@ public class Main extends JavaPlugin {
|
|||||||
|
|
||||||
registerCommand("tpa", new TpaCommand(), new PlayerNameCompleter());
|
registerCommand("tpa", new TpaCommand(), new PlayerNameCompleter());
|
||||||
registerCommand("tpaHere", new TpaHereCommand(), new PlayerNameCompleter());
|
registerCommand("tpaHere", new TpaHereCommand(), new PlayerNameCompleter());
|
||||||
registerCommand("tpAccept", new TpAcceptCommand(), new PlayerNameCompleter());
|
registerCommand("tpAccept", new TpAcceptCommand(), new TpRequestCompleter());
|
||||||
registerCommand("tpDeny", new TpDenyCommand(), new PlayerNameCompleter());
|
registerCommand("tpDeny", new TpDenyCommand(), new TpRequestCompleter());
|
||||||
|
|
||||||
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||||
|
|
||||||
@ -71,6 +67,8 @@ public class Main extends JavaPlugin {
|
|||||||
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
getRequestManager().shutdown();
|
||||||
|
|
||||||
log("卸载监听器...");
|
log("卸载监听器...");
|
||||||
Bukkit.getServicesManager().unregisterAll(this);
|
Bukkit.getServicesManager().unregisterAll(this);
|
||||||
|
|
||||||
|
@ -1,17 +1,37 @@
|
|||||||
package cc.carm.plugin.moeteleport.command.home;
|
package cc.carm.plugin.moeteleport.command.home;
|
||||||
|
|
||||||
|
import cc.carm.plugin.moeteleport.Main;
|
||||||
|
import cc.carm.plugin.moeteleport.configuration.PluginMessages;
|
||||||
|
import cc.carm.plugin.moeteleport.configuration.location.DataLocation;
|
||||||
|
import cc.carm.plugin.moeteleport.model.UserData;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class DelHomeCommand implements CommandExecutor {
|
public class DelHomeCommand 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;
|
||||||
|
if (args.length < 1) return false;
|
||||||
|
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
|
UserData data = Main.getUserManager().getData(player);
|
||||||
|
String homeName = args[0];
|
||||||
|
Map.Entry<String, DataLocation> locationInfo = data.getHomeLocation(homeName);
|
||||||
|
if (locationInfo == null) {
|
||||||
|
PluginMessages.Home.NOT_FOUND.sendWithPlaceholders(player);
|
||||||
|
} else {
|
||||||
|
PluginMessages.Home.REMOVED.sendWithPlaceholders(player,
|
||||||
|
new String[]{"%(name)", "%(location)"},
|
||||||
|
new Object[]{locationInfo.getKey(), locationInfo.getValue().toString()});
|
||||||
|
data.delHomeLocation(homeName);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,17 +1,33 @@
|
|||||||
package cc.carm.plugin.moeteleport.command.home;
|
package cc.carm.plugin.moeteleport.command.home;
|
||||||
|
|
||||||
|
import cc.carm.plugin.moeteleport.Main;
|
||||||
|
import cc.carm.plugin.moeteleport.configuration.PluginMessages;
|
||||||
|
import cc.carm.plugin.moeteleport.configuration.location.DataLocation;
|
||||||
|
import cc.carm.plugin.moeteleport.manager.TeleportManager;
|
||||||
|
import cc.carm.plugin.moeteleport.model.UserData;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class GoHomeCommand implements CommandExecutor {
|
public class GoHomeCommand 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);
|
||||||
|
String homeName = args.length >= 1 ? args[0] : null;
|
||||||
|
Map.Entry<String, DataLocation> locationInfo = data.getHomeLocation(homeName);
|
||||||
|
if (locationInfo == null) {
|
||||||
|
PluginMessages.Home.NOT_FOUND.sendWithPlaceholders(player);
|
||||||
|
} else {
|
||||||
|
TeleportManager.teleport(player, locationInfo.getValue());
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
public class ListHomeCommand implements CommandExecutor {
|
public class ListHomeCommand 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);
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package cc.carm.plugin.moeteleport.command.home;
|
package cc.carm.plugin.moeteleport.command.home;
|
||||||
|
|
||||||
|
import cc.carm.plugin.moeteleport.Main;
|
||||||
|
import cc.carm.plugin.moeteleport.configuration.PluginMessages;
|
||||||
|
import cc.carm.plugin.moeteleport.model.UserData;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@ -9,11 +12,16 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
public class SetHomeCommand implements CommandExecutor {
|
public class SetHomeCommand 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);
|
||||||
|
String homeName = args.length >= 1 ? args[0] : "home";
|
||||||
|
data.setHomeLocation(homeName, player.getLocation());
|
||||||
|
PluginMessages.Home.SET.sendWithPlaceholders(player,
|
||||||
|
new String[]{"%(name)"}, new Object[]{homeName}
|
||||||
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
package cc.carm.plugin.moeteleport.command.tpa;
|
||||||
|
|
||||||
|
import cc.carm.plugin.moeteleport.Main;
|
||||||
|
import cc.carm.plugin.moeteleport.model.UserData;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.StringUtil;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class TpRequestCompleter implements TabCompleter {
|
||||||
|
|
||||||
|
List<Integer> indexes;
|
||||||
|
|
||||||
|
public TpRequestCompleter() {
|
||||||
|
this(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TpRequestCompleter(Integer index) {
|
||||||
|
this(new Integer[]{index});
|
||||||
|
}
|
||||||
|
|
||||||
|
public TpRequestCompleter(Integer[] indexes) {
|
||||||
|
this.indexes = Arrays.asList(indexes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
|
||||||
|
if (!(sender instanceof Player)) return ImmutableList.of();
|
||||||
|
if (args.length >= 1 && indexes.contains(args.length)) {
|
||||||
|
UserData data = Main.getUserManager().getData((Player) sender);
|
||||||
|
return data.getReceivedRequests().stream()
|
||||||
|
.map(Bukkit::getPlayer).filter(Objects::nonNull).map(HumanEntity::getName)
|
||||||
|
.filter(s -> StringUtil.startsWithIgnoreCase(s, args[args.length - 1]))
|
||||||
|
.limit(10).collect(Collectors.toList());
|
||||||
|
} else {
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -18,13 +18,18 @@ public class PluginMessages {
|
|||||||
|
|
||||||
public static final ConfigMessageList TELEPORTING = new ConfigMessageList("teleporting");
|
public static final ConfigMessageList TELEPORTING = new ConfigMessageList("teleporting");
|
||||||
public static final ConfigMessageList DANGEROUS = new ConfigMessageList("dangerous");
|
public static final ConfigMessageList DANGEROUS = new ConfigMessageList("dangerous");
|
||||||
|
public static final ConfigMessageList DANGEROUS_HERE = new ConfigMessageList("dangerous-here");
|
||||||
|
|
||||||
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 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 MULTI = new ConfigMessageList("multi-requests");
|
public static final ConfigMessageList MULTI = new ConfigMessageList("multi-requests");
|
||||||
public static final ConfigMessageList TIMEOUT = new ConfigMessageList("request-timeout");
|
public static final ConfigMessageList SENT_TIMEOUT = new ConfigMessageList("request-sent-timeout");
|
||||||
|
public static final ConfigMessageList RECEIVED_TIMEOUT = new ConfigMessageList("request-received-timeout");
|
||||||
|
|
||||||
public static final ConfigMessageList NOT_FOUND = new ConfigMessageList("no-request");
|
public static final ConfigMessageList NOT_FOUND = new ConfigMessageList("no-request");
|
||||||
public static final ConfigMessageList NOT_FOUND_PLAYER = new ConfigMessageList("no-request-player");
|
public static final ConfigMessageList NOT_FOUND_PLAYER = new ConfigMessageList("no-request-player");
|
||||||
}
|
}
|
||||||
@ -32,6 +37,12 @@ public class PluginMessages {
|
|||||||
public static class Home {
|
public static class Home {
|
||||||
public static final ConfigMessageList HEADER = new ConfigMessageList("home-list-header");
|
public static final ConfigMessageList HEADER = new ConfigMessageList("home-list-header");
|
||||||
public static final ConfigMessage LIST_OBJECT = new ConfigMessage("home-list-object");
|
public static final ConfigMessage LIST_OBJECT = new ConfigMessage("home-list-object");
|
||||||
|
|
||||||
|
public static final ConfigMessageList NOT_FOUND = new ConfigMessageList("home-not-found");
|
||||||
|
public static final ConfigMessageList SET = new ConfigMessageList("home-set");
|
||||||
|
|
||||||
|
public static final ConfigMessageList REMOVED = new ConfigMessageList("home-removed");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
package cc.carm.plugin.moeteleport.manager;
|
package cc.carm.plugin.moeteleport.manager;
|
||||||
|
|
||||||
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.PluginMessages;
|
import cc.carm.plugin.moeteleport.configuration.PluginMessages;
|
||||||
|
import cc.carm.plugin.moeteleport.model.TeleportRequest;
|
||||||
import cc.carm.plugin.moeteleport.model.UserData;
|
import cc.carm.plugin.moeteleport.model.UserData;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -14,11 +17,72 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
public class RequestManager {
|
public class RequestManager {
|
||||||
|
|
||||||
public void sendTpaRequest(Player sender, Player receiver) {
|
public BukkitRunnable checkRunnable;
|
||||||
|
|
||||||
|
public RequestManager(Main main) {
|
||||||
|
this.checkRunnable = new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
checkRequests();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.checkRunnable.runTaskTimerAsynchronously(main, 100L, 20L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void shutdown() {
|
||||||
|
if (!this.checkRunnable.isCancelled()) {
|
||||||
|
this.checkRunnable.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkRequests() {
|
||||||
|
Main.getUserManager().getUserDataMap().values()
|
||||||
|
.forEach(data -> data.getSentRequests().entrySet().stream()
|
||||||
|
.filter(entry -> entry.getValue().isExpired())
|
||||||
|
.peek(entry -> PluginMessages.Request.SENT_TIMEOUT.sendWithPlaceholders(
|
||||||
|
entry.getValue().getSender(), new String[]{"%(player)"},
|
||||||
|
new Object[]{entry.getValue().getReceiver().getName()}))
|
||||||
|
.peek(entry -> PluginMessages.Request.RECEIVED_TIMEOUT.sendWithPlaceholders(
|
||||||
|
entry.getValue().getReceiver(), new String[]{"%(player)"},
|
||||||
|
new Object[]{entry.getValue().getSender().getName()}))
|
||||||
|
.forEach(entry -> data.getSentRequests().remove(entry.getKey()))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendTpaRequest(Player sender, Player receiver) {
|
||||||
|
int expireTime = PluginConfig.EXPIRE_TIME.get();
|
||||||
|
|
||||||
|
PluginMessages.Request.SENT.sendWithPlaceholders(sender,
|
||||||
|
new String[]{"%(player)", "%(expire)"},
|
||||||
|
new Object[]{receiver, expireTime}
|
||||||
|
);
|
||||||
|
PluginMessages.TPA.sendWithPlaceholders(receiver,
|
||||||
|
new String[]{"%(player)", "%(expire)"},
|
||||||
|
new Object[]{sender.getName(), expireTime}
|
||||||
|
);
|
||||||
|
|
||||||
|
TeleportRequest request = new TeleportRequest(sender, receiver, sender);
|
||||||
|
|
||||||
|
Main.getUserManager().getData(sender).getSentRequests().put(receiver.getUniqueId(), request);
|
||||||
|
Main.getUserManager().getData(receiver).getReceivedRequests().add(sender.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendTpaHereRequest(Player sender, Player receiver) {
|
public void sendTpaHereRequest(Player sender, Player receiver) {
|
||||||
|
int expireTime = PluginConfig.EXPIRE_TIME.get();
|
||||||
|
|
||||||
|
PluginMessages.Request.SENT.sendWithPlaceholders(sender,
|
||||||
|
new String[]{"%(player)", "%(expire)"},
|
||||||
|
new Object[]{receiver, expireTime}
|
||||||
|
);
|
||||||
|
PluginMessages.TPA_HERE.sendWithPlaceholders(receiver,
|
||||||
|
new String[]{"%(player)", "%(expire)"},
|
||||||
|
new Object[]{sender.getName(), expireTime}
|
||||||
|
);
|
||||||
|
|
||||||
|
TeleportRequest request = new TeleportRequest(sender, receiver, receiver);
|
||||||
|
|
||||||
|
Main.getUserManager().getData(sender).getSentRequests().put(receiver.getUniqueId(), request);
|
||||||
|
Main.getUserManager().getData(receiver).getReceivedRequests().add(sender.getUniqueId());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,18 @@ import org.bukkit.entity.Player;
|
|||||||
|
|
||||||
public class TeleportManager {
|
public class TeleportManager {
|
||||||
|
|
||||||
|
public static void teleport(Player player, DataLocation targetLocation) {
|
||||||
|
Location location = targetLocation.getBukkitLocation();
|
||||||
|
if (location == null) {
|
||||||
|
PluginMessages.NOT_AVAILABLE.sendWithPlaceholders(player,
|
||||||
|
new String[]{"%(location)"},
|
||||||
|
new Object[]{targetLocation.toString()}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
teleport(player, location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void teleport(Player player, Location targetLocation) {
|
public static void teleport(Player player, Location targetLocation) {
|
||||||
if (targetLocation.isWorldLoaded()) {
|
if (targetLocation.isWorldLoaded()) {
|
||||||
player.teleport(targetLocation);
|
player.teleport(targetLocation);
|
||||||
|
@ -2,61 +2,55 @@ 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.configuration.PluginMessages;
|
||||||
import cc.carm.plugin.moeteleport.configuration.location.DataLocation;
|
|
||||||
import cc.carm.plugin.moeteleport.manager.TeleportManager;
|
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;
|
||||||
|
|
||||||
public class TeleportRequest {
|
public class TeleportRequest {
|
||||||
|
|
||||||
final Player sender;
|
final @NotNull Player sender;
|
||||||
final Player receiver;
|
final @NotNull Player receiver;
|
||||||
/**
|
/**
|
||||||
* 用于记录需要被传送的玩家
|
* 用于记录需要被传送的玩家
|
||||||
*/
|
*/
|
||||||
final Player teleportPlayer;
|
final @NotNull Player teleportPlayer;
|
||||||
|
|
||||||
final DataLocation targetLocation;
|
|
||||||
|
|
||||||
final long createTime;
|
final long createTime;
|
||||||
|
|
||||||
public TeleportRequest(Player sender, Player receiver, Player teleportPlayer,
|
public TeleportRequest(@NotNull Player sender,
|
||||||
DataLocation targetLocation, long createTime) {
|
@NotNull Player receiver,
|
||||||
|
@NotNull Player teleportPlayer) {
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
this.receiver = receiver;
|
this.receiver = receiver;
|
||||||
this.teleportPlayer = teleportPlayer;
|
this.teleportPlayer = teleportPlayer;
|
||||||
this.targetLocation = targetLocation;
|
this.createTime = System.currentTimeMillis();
|
||||||
this.createTime = createTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player getSender() {
|
public @NotNull Player getSender() {
|
||||||
return sender;
|
return sender;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player getReceiver() {
|
public @NotNull Player getReceiver() {
|
||||||
return receiver;
|
return receiver;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Player getTeleportPlayer() {
|
public @NotNull Player getTeleportPlayer() {
|
||||||
return teleportPlayer;
|
return teleportPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DataLocation getTargetLocation() {
|
|
||||||
return targetLocation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getCreateTime() {
|
public long getCreateTime() {
|
||||||
return createTime;
|
return createTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 尝试对玩家进行传送
|
* 尝试对玩家进行传送
|
||||||
*
|
*
|
||||||
* @return 是否传送成功
|
* @return 是否传送成功
|
||||||
*/
|
*/
|
||||||
public boolean tryTeleport() {
|
public boolean tryTeleport(@NotNull Location location) {
|
||||||
Location location = getTargetLocation().getBukkitLocation();
|
if (!location.isWorldLoaded()) return false;
|
||||||
if (location == null) return false;
|
|
||||||
if (!TeleportManager.isSafeLocation(location)) {
|
if (!TeleportManager.isSafeLocation(location)) {
|
||||||
PluginMessages.DANGEROUS.sendWithPlaceholders(getTeleportPlayer());
|
PluginMessages.DANGEROUS.sendWithPlaceholders(getTeleportPlayer());
|
||||||
return false;
|
return false;
|
||||||
|
@ -12,6 +12,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class UserData {
|
public class UserData {
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ public class UserData {
|
|||||||
|
|
||||||
private LinkedHashMap<String, DataLocation> homeLocations;
|
private LinkedHashMap<String, DataLocation> homeLocations;
|
||||||
|
|
||||||
private HashMap<UUID/*receiverUUID*/, TeleportRequest> sentRequests; // 记录发出的请求
|
private ConcurrentHashMap<UUID/*receiverUUID*/, TeleportRequest> sentRequests; // 记录发出的请求
|
||||||
private HashSet<UUID/*senderUUID*/> receivedRequests; // 记录收到的传送请求
|
private HashSet<UUID/*senderUUID*/> receivedRequests; // 记录收到的传送请求
|
||||||
|
|
||||||
public UserData(@NotNull File dataFolder, @NotNull UUID uuid) {
|
public UserData(@NotNull File dataFolder, @NotNull UUID uuid) {
|
||||||
@ -57,17 +58,28 @@ public class UserData {
|
|||||||
return homeLocations;
|
return homeLocations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DataLocation getHomeLocation(@Nullable String homeName) {
|
public void setHomeLocation(String homeName, Location location) {
|
||||||
|
delHomeLocation(homeName);
|
||||||
|
getHomeLocations().put(homeName, new DataLocation(location));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delHomeLocation(String homeName) {
|
||||||
|
Map.Entry<String, DataLocation> lastLocation = getHomeLocation(homeName);
|
||||||
|
if (lastLocation != null) getHomeLocations().remove(lastLocation.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map.Entry<String, DataLocation> getHomeLocation(@Nullable String homeName) {
|
||||||
LinkedHashMap<String, DataLocation> homes = getHomeLocations();
|
LinkedHashMap<String, DataLocation> homes = getHomeLocations();
|
||||||
if (homeName == null) {
|
if (homeName == null) {
|
||||||
if (homes.size() > 1) {
|
if (homes.containsKey("home")) {
|
||||||
return homes.get("home");
|
return new AbstractMap.SimpleEntry<>("home", homes.get("home"));
|
||||||
} else {
|
} else {
|
||||||
if (homes.containsKey("home")) return homes.get("home");
|
return homes.entrySet().stream().findFirst().orElse(null);
|
||||||
else return homes.values().stream().findFirst().orElse(null);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return homes.get(homeName);
|
return homes.entrySet().stream()
|
||||||
|
.filter(entry -> entry.getKey().equalsIgnoreCase(homeName))
|
||||||
|
.findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +96,7 @@ public class UserData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public HashMap<UUID, TeleportRequest> getSentRequests() {
|
public ConcurrentHashMap<UUID, TeleportRequest> getSentRequests() {
|
||||||
return sentRequests;
|
return sentRequests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
no-last-location:
|
no-last-location:
|
||||||
- "&f您当前没有进行传送,无法返回上个地点。"
|
- "&f您当前没有进行传送,无法返回上个地点。"
|
||||||
tpa:
|
tpa:
|
||||||
- "&6%(player) &f请求传送到您身边,您有30秒的时间处理。"
|
- "&6%(player) &f请求传送到您身边,您有%(expire)秒的时间回应。"
|
||||||
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。"
|
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。"
|
||||||
- "&c&l[拒绝] &f输入 &e/tpdeny &f拒绝该请求。"
|
- "&c&l[拒绝] &f输入 &e/tpdeny &f拒绝该请求。"
|
||||||
tpahere:
|
tpahere:
|
||||||
- "&6%(player) &f请求传送您到Ta身边,您有30秒的时间处理。"
|
- "&6%(player) &f请求传送您到Ta身边,您有%(expire)秒的时间回应。"
|
||||||
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。"
|
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。"
|
||||||
- "&c&l[拒绝] &f输入 &e/tpdeny &f拒绝该请求。"
|
- "&c&l[拒绝] &f输入 &e/tpdeny &f拒绝该请求。"
|
||||||
tpaccept:
|
tpaccept:
|
||||||
@ -19,22 +19,35 @@ denied:
|
|||||||
offline:
|
offline:
|
||||||
- "&6%(player) &f离线,相关请求已自动取消。"
|
- "&6%(player) &f离线,相关请求已自动取消。"
|
||||||
|
|
||||||
|
request-sent:
|
||||||
|
- "&f成功向玩家 &6%(player) 发送传送请求,对方有%(expire)秒的时间回应该请求。"
|
||||||
no-request:
|
no-request:
|
||||||
- "&f您当前没有任何待处理的传送请求。"
|
- "&f您当前没有任何待处理的传送请求。"
|
||||||
no-request-player:
|
no-request-player:
|
||||||
- "&f您当前没有收到来自 &6%(player) &f的传送请求。"
|
- "&f您当前没有收到来自 &6%(player) &f的传送请求。"
|
||||||
multi-requests:
|
multi-requests:
|
||||||
- "&f您当前有条请求待处理,请输入 &6%(command) <玩家名> &f决定处理谁的请求。"
|
- "&f您当前有条请求待处理,请输入 &6%(command) <玩家名> &f决定回应谁的请求。"
|
||||||
- "&f您也可以再次输入 &6%(command) &f直接处理最近的一条请求。"
|
- "&f您也可以再次输入 &6%(command) &f直接回应最近的一条请求。"
|
||||||
request-timeout:
|
request-sent-timeout:
|
||||||
|
- "&f发往 &6%(player) &f的传送请求已超时。"
|
||||||
|
request-received-timeout:
|
||||||
- "&f来自 &6%(player) &f的传送请求已超时。"
|
- "&f来自 &6%(player) &f的传送请求已超时。"
|
||||||
teleporting:
|
teleporting:
|
||||||
- "&f正在传送到 &6%(location) &f..."
|
- "&f正在传送到 &6%(location) &f..."
|
||||||
dangerous:
|
dangerous:
|
||||||
- "&f目标地点不安全,传送被取消。"
|
- "&f目标地点不安全,传送被取消。"
|
||||||
|
dangerous-here:
|
||||||
|
- "&f当前地点不安全,无法发送传送请求。"
|
||||||
notAvailable:
|
notAvailable:
|
||||||
- "&f目标地点暂时无法前往,传送被取消。"
|
- "&f目标地点暂时无法前往,传送被取消。"
|
||||||
|
|
||||||
home-list-header:
|
home-list-header:
|
||||||
- "&f您当前设定的所有家:"
|
- "&f您当前设定的所有家:"
|
||||||
home-list-object: "&8#&f%(id) &6%(location)"
|
home-list-object: "&8#&f%(id) &6%(location)"
|
||||||
|
home-not-found:
|
||||||
|
- "&f您还没有设置这个家,请先输入 &e/setHome <家名称> &f设置一个吧!"
|
||||||
|
home-set:
|
||||||
|
- "&f成功设定名为 &6%(name) &f的家传送点。"
|
||||||
|
home-removed:
|
||||||
|
- "&f成功移除名为 &6%(name) &f的家传送点。"
|
||||||
|
- "&7原先位置为 &f%(location) &7。"
|
Loading…
Reference in New Issue
Block a user