mirror of
https://github.com/CarmJos/MoeTeleport.git
synced 2024-09-19 21:35:56 +00:00
完成TPA功能
This commit is contained in:
parent
106e41492e
commit
fe243c9214
@ -1,6 +1,9 @@
|
||||
package cc.carm.plugin.moeteleport;
|
||||
|
||||
import cc.carm.plugin.moeteleport.command.BackCommand;
|
||||
import cc.carm.plugin.moeteleport.command.completer.HomeNameCompleter;
|
||||
import cc.carm.plugin.moeteleport.command.completer.PlayerNameCompleter;
|
||||
import cc.carm.plugin.moeteleport.command.completer.TpRequestCompleter;
|
||||
import cc.carm.plugin.moeteleport.command.home.*;
|
||||
import cc.carm.plugin.moeteleport.command.tpa.*;
|
||||
import cc.carm.plugin.moeteleport.listener.UserListener;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package cc.carm.plugin.moeteleport.command.home;
|
||||
package cc.carm.plugin.moeteleport.command.completer;
|
||||
|
||||
import cc.carm.plugin.moeteleport.Main;
|
||||
import com.google.common.collect.ImmutableList;
|
@ -1,4 +1,4 @@
|
||||
package cc.carm.plugin.moeteleport.command.tpa;
|
||||
package cc.carm.plugin.moeteleport.command.completer;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.Bukkit;
|
@ -1,4 +1,4 @@
|
||||
package cc.carm.plugin.moeteleport.command.tpa;
|
||||
package cc.carm.plugin.moeteleport.command.completer;
|
||||
|
||||
import cc.carm.plugin.moeteleport.Main;
|
||||
import cc.carm.plugin.moeteleport.model.UserData;
|
||||
@ -40,7 +40,7 @@ public class TpRequestCompleter implements TabCompleter {
|
||||
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()
|
||||
return data.getReceivedRequests().keySet().stream()
|
||||
.map(Bukkit::getPlayer).filter(Objects::nonNull).map(HumanEntity::getName)
|
||||
.filter(s -> StringUtil.startsWithIgnoreCase(s, args[args.length - 1]))
|
||||
.limit(10).collect(Collectors.toList());
|
@ -1,17 +1,46 @@
|
||||
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 TpAcceptCommand 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().acceptRequest(request); // 交给Manager处理
|
||||
}
|
||||
} else {
|
||||
data.getReceivedRequests().values().stream()
|
||||
.min(Comparator.comparingLong(TeleportRequest::getActiveTime))
|
||||
.ifPresent(request -> Main.getRequestManager().acceptRequest(request));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1,17 +1,46 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,9 @@
|
||||
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;
|
||||
@ -10,8 +14,14 @@ public class TpaCommand implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
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) || 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);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,9 @@
|
||||
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;
|
||||
@ -10,8 +14,14 @@ 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)) return false;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,8 @@ public class PluginMessages {
|
||||
|
||||
public static final ConfigMessageList NO_LAST_LOCATION = new ConfigMessageList("no-last-location");
|
||||
|
||||
public static final ConfigMessageList NOT_ONLINE = new ConfigMessageList("not-online");
|
||||
|
||||
public static final ConfigMessageList TPA = new ConfigMessageList("tpa");
|
||||
public static final ConfigMessageList TPA_HERE = new ConfigMessageList("tpahere");
|
||||
|
||||
|
@ -9,11 +9,8 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class RequestManager {
|
||||
|
||||
@ -37,7 +34,7 @@ public class RequestManager {
|
||||
|
||||
public void checkRequests() {
|
||||
Main.getUserManager().getUserDataMap().values()
|
||||
.forEach(data -> data.getSentRequests().entrySet().stream()
|
||||
.forEach(data -> data.getReceivedRequests().entrySet().stream()
|
||||
.filter(entry -> entry.getValue().isExpired())
|
||||
.peek(entry -> PluginMessages.Request.SENT_TIMEOUT.sendWithPlaceholders(
|
||||
entry.getValue().getSender(), new String[]{"%(player)"},
|
||||
@ -49,55 +46,74 @@ public class RequestManager {
|
||||
);
|
||||
}
|
||||
|
||||
public void sendTpaRequest(Player sender, Player receiver) {
|
||||
public void sendRequest(Player sender, Player receiver, TeleportRequest.RequestType type) {
|
||||
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}
|
||||
);
|
||||
switch (type) {
|
||||
case TPA: {
|
||||
PluginMessages.TPA.sendWithPlaceholders(receiver,
|
||||
new String[]{"%(player)", "%(expire)"},
|
||||
new Object[]{sender.getName(), expireTime}
|
||||
);
|
||||
break;
|
||||
}
|
||||
case TPA_HERE: {
|
||||
PluginMessages.TPA_HERE.sendWithPlaceholders(receiver,
|
||||
new String[]{"%(player)", "%(expire)"},
|
||||
new Object[]{sender.getName(), expireTime}
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TeleportRequest request = new TeleportRequest(sender, receiver, sender);
|
||||
TeleportRequest request = new TeleportRequest(sender, receiver, type);
|
||||
Main.getUserManager().getData(receiver).getReceivedRequests().put(sender.getUniqueId(), request);
|
||||
Main.getUserManager().getData(sender).getSentRequests().add(receiver.getUniqueId());
|
||||
|
||||
Main.getUserManager().getData(sender).getSentRequests().put(receiver.getUniqueId(), request);
|
||||
Main.getUserManager().getData(receiver).getReceivedRequests().add(sender.getUniqueId());
|
||||
}
|
||||
|
||||
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}
|
||||
public void acceptRequest(TeleportRequest request) {
|
||||
PluginMessages.ACCEPTED.sendWithPlaceholders(request.getSender(),
|
||||
new String[]{"%(player)"},
|
||||
new Object[]{request.getReceiver().getName()}
|
||||
);
|
||||
PluginMessages.TPA_HERE.sendWithPlaceholders(receiver,
|
||||
new String[]{"%(player)", "%(expire)"},
|
||||
new Object[]{sender.getName(), expireTime}
|
||||
PluginMessages.TP_ACCEPT.sendWithPlaceholders(request.getReceiver(),
|
||||
new String[]{"%(player)"},
|
||||
new Object[]{request.getSender().getName()}
|
||||
);
|
||||
TeleportManager.teleport(request.getTeleportPlayer(), request.getTeleportLocation());
|
||||
removeRequests(request);
|
||||
}
|
||||
|
||||
TeleportRequest request = new TeleportRequest(sender, receiver, receiver);
|
||||
|
||||
Main.getUserManager().getData(sender).getSentRequests().put(receiver.getUniqueId(), request);
|
||||
Main.getUserManager().getData(receiver).getReceivedRequests().add(sender.getUniqueId());
|
||||
public void denyRequest(TeleportRequest request) {
|
||||
PluginMessages.DENIED.sendWithPlaceholders(request.getSender(),
|
||||
new String[]{"%(player)"},
|
||||
new Object[]{request.getReceiver().getName()}
|
||||
);
|
||||
PluginMessages.TP_DENY.sendWithPlaceholders(request.getReceiver(),
|
||||
new String[]{"%(player)"},
|
||||
new Object[]{request.getSender().getName()}
|
||||
);
|
||||
removeRequests(request);
|
||||
}
|
||||
|
||||
public void removeRequests(TeleportRequest request) {
|
||||
Main.getUserManager().getData(request.getSender())
|
||||
.getSentRequests()
|
||||
.remove(request.getReceiver().getUniqueId());
|
||||
Main.getUserManager().getData(request.getReceiver())
|
||||
.getReceivedRequests()
|
||||
.remove(request.getSender().getUniqueId());
|
||||
}
|
||||
|
||||
public void cancelAllRequests(Player player) {
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
UserData data = Main.getUserManager().getData(player);
|
||||
data.getSentRequests().keySet().stream()
|
||||
.peek(receiverUUID -> PluginMessages.Request.OFFLINE.sendWithPlaceholders(
|
||||
Bukkit.getPlayer(receiverUUID),
|
||||
new String[]{"%(player)"}, new Object[]{player.getName()}
|
||||
)).map(receiverUUID -> Main.getUserManager().getData(receiverUUID))
|
||||
.filter(Objects::nonNull).map(UserData::getReceivedRequests)
|
||||
.forEach(senders -> senders.remove(playerUUID));
|
||||
|
||||
data.getReceivedRequests().stream()
|
||||
data.getReceivedRequests().keySet().stream()
|
||||
.peek(senderUUID -> PluginMessages.Request.OFFLINE.sendWithPlaceholders(
|
||||
Bukkit.getPlayer(senderUUID),
|
||||
new String[]{"%(player)"}, new Object[]{player.getName()}
|
||||
@ -105,38 +121,14 @@ public class RequestManager {
|
||||
.filter(Objects::nonNull).map(UserData::getSentRequests)
|
||||
.forEach(receivers -> receivers.remove(playerUUID));
|
||||
|
||||
data.getSentRequests().clear();
|
||||
data.getReceivedRequests().clear();
|
||||
}
|
||||
|
||||
public Set<Player> getRequestedPlayers(Player player) {
|
||||
UserData data = Main.getUserManager().getData(player);
|
||||
HashSet<UUID> relatedUUIDs = new HashSet<>();
|
||||
relatedUUIDs.addAll(data.getReceivedRequests());
|
||||
relatedUUIDs.addAll(data.getSentRequests().keySet());
|
||||
|
||||
return relatedUUIDs.stream()
|
||||
.map(Bukkit::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消某玩家所有相关的传送请求
|
||||
*
|
||||
* @param player 玩家
|
||||
*/
|
||||
public void clearAllRequests(Player player) {
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
UserData data = Main.getUserManager().getData(player);
|
||||
data.getSentRequests().keySet().stream()
|
||||
.map(receiver -> Main.getUserManager().getData(receiver))
|
||||
data.getSentRequests().stream()
|
||||
.peek(receiverUUID -> PluginMessages.Request.OFFLINE.sendWithPlaceholders(
|
||||
Bukkit.getPlayer(receiverUUID),
|
||||
new String[]{"%(player)"}, new Object[]{player.getName()}
|
||||
)).map(receiverUUID -> Main.getUserManager().getData(receiverUUID))
|
||||
.filter(Objects::nonNull).map(UserData::getReceivedRequests)
|
||||
.forEach(senders -> senders.remove(playerUUID));
|
||||
data.getReceivedRequests().stream()
|
||||
.map(sender -> Main.getUserManager().getData(sender))
|
||||
.filter(Objects::nonNull).map(UserData::getSentRequests)
|
||||
.forEach(receivers -> receivers.remove(playerUUID));
|
||||
|
||||
data.getSentRequests().clear();
|
||||
data.getReceivedRequests().clear();
|
||||
}
|
||||
|
@ -11,19 +11,16 @@ public class TeleportRequest {
|
||||
|
||||
final @NotNull Player sender;
|
||||
final @NotNull Player receiver;
|
||||
/**
|
||||
* 用于记录需要被传送的玩家
|
||||
*/
|
||||
final @NotNull Player teleportPlayer;
|
||||
final @NotNull RequestType type;
|
||||
|
||||
final long createTime;
|
||||
|
||||
public TeleportRequest(@NotNull Player sender,
|
||||
@NotNull Player receiver,
|
||||
@NotNull Player teleportPlayer) {
|
||||
@NotNull RequestType type) {
|
||||
this.sender = sender;
|
||||
this.receiver = receiver;
|
||||
this.teleportPlayer = teleportPlayer;
|
||||
this.type = type;
|
||||
this.createTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
@ -36,13 +33,25 @@ public class TeleportRequest {
|
||||
}
|
||||
|
||||
public @NotNull Player getTeleportPlayer() {
|
||||
return teleportPlayer;
|
||||
return getType() == RequestType.TPA ? getSender() : getReceiver();
|
||||
}
|
||||
|
||||
public @NotNull Location getTeleportLocation() {
|
||||
return getType() == RequestType.TPA_HERE ? getSender().getLocation() : getReceiver().getLocation();
|
||||
}
|
||||
|
||||
public @NotNull RequestType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public long getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public long getActiveTime() {
|
||||
return System.currentTimeMillis() - getCreateTime();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 尝试对玩家进行传送
|
||||
@ -61,7 +70,12 @@ public class TeleportRequest {
|
||||
}
|
||||
|
||||
public boolean isExpired() {
|
||||
return (System.currentTimeMillis() - getCreateTime()) > PluginConfig.EXPIRE_TIME.get() * 10000;
|
||||
return getActiveTime() > PluginConfig.EXPIRE_TIME.get() * 10000;
|
||||
}
|
||||
|
||||
public enum RequestType {
|
||||
TPA,
|
||||
TPA_HERE
|
||||
}
|
||||
|
||||
|
||||
|
@ -23,8 +23,8 @@ public class UserData {
|
||||
|
||||
private LinkedHashMap<String, DataLocation> homeLocations;
|
||||
|
||||
private ConcurrentHashMap<UUID/*receiverUUID*/, TeleportRequest> sentRequests; // 记录发出的请求
|
||||
private HashSet<UUID/*senderUUID*/> receivedRequests; // 记录收到的传送请求
|
||||
private HashSet<UUID/*receiverUUID*/> sentRequests; // 记录发出的请求
|
||||
private ConcurrentHashMap<UUID/*senderUUID*/, TeleportRequest> receivedRequests; // 记录收到的传送请求
|
||||
|
||||
public UserData(@NotNull File dataFolder, @NotNull UUID uuid) {
|
||||
this(new File(dataFolder, uuid + ".yml"));
|
||||
@ -95,12 +95,11 @@ public class UserData {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public ConcurrentHashMap<UUID, TeleportRequest> getSentRequests() {
|
||||
public HashSet<UUID> getSentRequests() {
|
||||
return sentRequests;
|
||||
}
|
||||
|
||||
public HashSet<UUID> getReceivedRequests() {
|
||||
public ConcurrentHashMap<UUID, TeleportRequest> getReceivedRequests() {
|
||||
return receivedRequests;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,8 @@
|
||||
no-last-location:
|
||||
- "&f您当前没有进行传送,无法返回上个地点。"
|
||||
|
||||
not-online:
|
||||
- "&f目标玩家并不在线,无法发送请求。"
|
||||
tpa:
|
||||
- "&6%(player) &f请求传送到您身边,您有%(expire)秒的时间回应。"
|
||||
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。"
|
||||
|
Loading…
Reference in New Issue
Block a user