1
mirror of https://github.com/CarmJos/MoeTeleport.git synced 2024-09-19 21:35:56 +00:00

完成TPA功能

This commit is contained in:
Carm Jos 2021-12-17 10:37:52 +08:00
parent 106e41492e
commit fe243c9214
13 changed files with 174 additions and 83 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,8 @@
no-last-location:
- "&f您当前没有进行传送无法返回上个地点。"
not-online:
- "&f目标玩家并不在线无法发送请求。"
tpa:
- "&6%(player) &f请求传送到您身边您有%(expire)秒的时间回应。"
- "&a&l[同意] &f输入 &e/tpaccept &f同意该请求。"