This commit is contained in:
parent
aa88ee6014
commit
c4e22963d6
2
pom.xml
2
pom.xml
@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>cn.lunadeer</groupId>
|
||||
<artifactId>EssentialsD</artifactId>
|
||||
<version>1.18.0</version>
|
||||
<version>1.18.11</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>EssentialsD</name>
|
||||
|
@ -5,6 +5,8 @@ import cn.lunadeer.essentialsd.recipes.Crowbar;
|
||||
import cn.lunadeer.essentialsd.recipes.InvisibleGlowItemFrame;
|
||||
import cn.lunadeer.essentialsd.recipes.InvisibleItemFrame;
|
||||
import cn.lunadeer.essentialsd.utils.Notification;
|
||||
import cn.lunadeer.essentialsd.utils.XLogger;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.block.Block;
|
||||
@ -16,11 +18,13 @@ import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.entity.ExpBottleEvent;
|
||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
|
||||
import org.bukkit.event.hanging.HangingPlaceEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEntityEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryView;
|
||||
@ -192,4 +196,11 @@ public class Events implements Listener {
|
||||
}
|
||||
event.setExperience((int) (exp * EssentialsD.config.getExpBottleRatio()));
|
||||
}
|
||||
|
||||
// on player death update tpManager
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onPlayerDeath(PlayerDeathEvent event) {
|
||||
Player player = event.getEntity();
|
||||
EssentialsD.tpManager.updateLastTpLocation(player);
|
||||
}
|
||||
}
|
||||
|
@ -2,21 +2,26 @@ package cn.lunadeer.essentialsd;
|
||||
|
||||
import cn.lunadeer.essentialsd.utils.Notification;
|
||||
import cn.lunadeer.essentialsd.utils.STUI.Button;
|
||||
import cn.lunadeer.essentialsd.utils.XLogger;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class TeleportManager {
|
||||
|
||||
private static final TextColor main_color = TextColor.color(0, 233, 255);
|
||||
|
||||
private final Map<UUID, TpTask> _tasks = new java.util.HashMap<>();
|
||||
private final Map<UUID, LocalDateTime> _next_time_allow_tp = new java.util.HashMap<>();
|
||||
private final ConcurrentHashMap<UUID, TpTask> _tasks = new ConcurrentHashMap<>();
|
||||
private final ConcurrentHashMap<UUID, LocalDateTime> _next_time_allow_tp = new ConcurrentHashMap<>();
|
||||
private final ConcurrentHashMap<UUID, Location> _last_tp_location = new ConcurrentHashMap<>();
|
||||
|
||||
private static class TpTask {
|
||||
public Player initiator;
|
||||
@ -102,21 +107,64 @@ public class TeleportManager {
|
||||
return;
|
||||
}
|
||||
Notification.info(task.target, "已接受 " + task.initiator.getName() + " 的传送请求");
|
||||
Notification.info(task.initiator, "玩家 " + task.target.getName() + " 已接受你的传送请求,传送将在 " + EssentialsD.config.getTpDelay() + " 秒后进行");
|
||||
if (EssentialsD.config.getTpDelay() > 0) {
|
||||
Notification.info(task.initiator, "玩家 " + task.target.getName() + " 已接受你的传送请求,传送将在 " + EssentialsD.config.getTpDelay() + " 秒后进行");
|
||||
}
|
||||
EssentialsD.scheduler.global.runDelayed(EssentialsD.instance, (instance) -> {
|
||||
if (task.initiator.isOnline() && task.target.isOnline()) {
|
||||
task.initiator.teleportAsync(task.target.getLocation());
|
||||
doTeleportSafely(task.initiator, task.target.getLocation());
|
||||
Notification.info(task.initiator, "已传送到 " + task.target.getName() + " 的位置");
|
||||
Notification.info(task.target, "玩家 " + task.initiator.getName() + " 已传送到你的位置");
|
||||
}
|
||||
}, EssentialsD.config.getTpDelay() == 0 ? 1 : 20L * EssentialsD.config.getTpDelay());
|
||||
}, EssentialsD.config.getTpDelay() <= 0 ? 1 : 20L * EssentialsD.config.getTpDelay());
|
||||
}
|
||||
|
||||
public void back(Player player) {
|
||||
// todo: implement back teleport
|
||||
if (!_last_tp_location.containsKey(player.getUniqueId())) {
|
||||
Notification.error(player, "没有找到可返回的位置");
|
||||
return;
|
||||
}
|
||||
if (EssentialsD.config.getTpDelay() > 0) {
|
||||
Notification.info(player, "将在 " + EssentialsD.config.getTpDelay() + " 秒后返回上次传送的位置");
|
||||
}
|
||||
EssentialsD.scheduler.global.runDelayed(EssentialsD.instance, (instance) -> {
|
||||
doTeleportSafely(player, _last_tp_location.get(player.getUniqueId()));
|
||||
Notification.info(player, "已返回上次传送的位置");
|
||||
}, EssentialsD.config.getTpDelay() <= 0 ? 1 : 20L * EssentialsD.config.getTpDelay());
|
||||
}
|
||||
|
||||
public void rtp(Player player) {
|
||||
// todo: implement rtp teleport
|
||||
int radius = EssentialsD.config.getTpRtpRadius();
|
||||
World world = player.getWorld();
|
||||
int x = (int) (Math.random() * radius * 2) - radius;
|
||||
int z = (int) (Math.random() * radius * 2) - radius;
|
||||
XLogger.debug("RTP: " + x + " " + z);
|
||||
Location location = new Location(world, x, player.getY(), z);
|
||||
if (EssentialsD.config.getTpDelay() > 0) {
|
||||
Notification.info(player, "将在 " + EssentialsD.config.getTpDelay() + " 秒后传送到随机位置");
|
||||
}
|
||||
EssentialsD.scheduler.global.runDelayed(EssentialsD.instance, (instance) -> {
|
||||
doTeleportSafely(player, location);
|
||||
Notification.info(player, "已传送到随机位置");
|
||||
}, EssentialsD.config.getTpDelay() <= 0 ? 1 : 20L * EssentialsD.config.getTpDelay());
|
||||
}
|
||||
|
||||
/**
|
||||
* 把玩家传送到指定位置 并更新上次传送的位置
|
||||
* 需要使用 schedule 传送
|
||||
*
|
||||
* @param player 玩家
|
||||
* @param location 位置
|
||||
*/
|
||||
private void doTeleportSafely(Player player, Location location) {
|
||||
location.getWorld().getChunkAtAsyncUrgently(location).thenAccept((chunk) -> {
|
||||
location.setY(chunk.getWorld().getHighestBlockYAt(location) + 1);
|
||||
player.teleportAsync(location, PlayerTeleportEvent.TeleportCause.PLUGIN);
|
||||
_last_tp_location.put(player.getUniqueId(), location);
|
||||
});
|
||||
}
|
||||
|
||||
public void updateLastTpLocation(Player player) {
|
||||
_last_tp_location.put(player.getUniqueId(), player.getLocation());
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package cn.lunadeer.essentialsd.commands;
|
||||
|
||||
import cn.lunadeer.essentialsd.EssentialsD;
|
||||
import cn.lunadeer.essentialsd.TeleportManager;
|
||||
import cn.lunadeer.essentialsd.utils.Notification;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -23,8 +24,7 @@ public class Back implements TabExecutor {
|
||||
return false;
|
||||
}
|
||||
Player player = (Player) sender;
|
||||
// todo: implement this command
|
||||
Notification.error(player, "这个命令还没有实现");
|
||||
EssentialsD.tpManager.back(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -23,8 +23,7 @@ public class Rtp implements TabExecutor {
|
||||
return false;
|
||||
}
|
||||
Player player = (Player) sender;
|
||||
// todo: implement this command
|
||||
Notification.error(player, "这个命令还没有实现");
|
||||
EssentialsD.tpManager.rtp(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
ExpBottleRatio: 1.0
|
||||
|
||||
# 强加载区块列表
|
||||
ForceLoadChunks:
|
||||
ForceLoadChunks: []
|
||||
# - world:0:0
|
||||
# - world_the_end:-12:12
|
||||
|
||||
@ -11,14 +11,14 @@ ForceLoadChunks:
|
||||
# -1 为禁用强加载区块操作
|
||||
ChunkOperateDelay: 10
|
||||
|
||||
# 特殊合成表
|
||||
# 扩展合成表
|
||||
Recipes:
|
||||
CrowBar: true # 撬棍
|
||||
InvisibleItemFrame: true # 隐形(发光)物品展示框
|
||||
LightBlock: true # 光源方块
|
||||
StackedEnchantBook: true # 附魔书堆叠
|
||||
|
||||
# 特殊指令
|
||||
# 扩展指令
|
||||
Commands:
|
||||
EnderChest: true # 快速末影箱
|
||||
Suicide: true # 自杀
|
||||
@ -36,6 +36,7 @@ Teleport:
|
||||
TpaExpire: 30 # 传送请求有效期 秒
|
||||
RtpRadius: 1000 # 随机传送最大半径
|
||||
|
||||
# 把楼梯当作椅子使用
|
||||
Chair:
|
||||
Enable: true
|
||||
MaxWidth: 4
|
||||
|
Loading…
Reference in New Issue
Block a user