From c51bd6067677064afafe26b2acdb66cd738e1af8 Mon Sep 17 00:00:00 2001 From: MiniDay <372403923@qq.com> Date: Wed, 10 May 2023 19:27:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=96=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- gradle.properties | 2 +- hamster-lobby/README.md | 35 ++++++ hamster-lobby/build.gradle | 10 ++ .../mc/plugin/lobby/bukkit/LobbyPlugin.java | 29 +++++ .../lobby/bukkit/listener/MainListener.java | 18 +++ .../bukkit/listener/ProtectListener.java | 104 ++++++++++++++++++ .../bukkit/listener/ServiceListener.java | 26 +++++ .../mc/plugin/lobby/bungee/LobbyPlugin.java | 31 ++++++ .../bungee/handler/LobbyReconnectHandler.java | 48 ++++++++ .../lobby/bungee/listener/MainListener.java | 59 ++++++++++ .../bungee/listener/ServiceListener.java | 40 +++++++ hamster-lobby/src/main/resources/bungee.yml | 5 + hamster-lobby/src/main/resources/plugin.yml | 12 ++ hamster-spawn/build.gradle | 10 ++ .../hamster3/mc/plugin/spawn/SpawnPlugin.java | 50 +++++++++ hamster-spawn/src/main/resources/config.yml | 0 hamster-spawn/src/main/resources/plugin.yml | 18 +++ settings.gradle | 3 + 19 files changed, 500 insertions(+), 2 deletions(-) create mode 100644 hamster-lobby/README.md create mode 100644 hamster-lobby/build.gradle create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/LobbyPlugin.java create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/MainListener.java create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ProtectListener.java create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ServiceListener.java create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/LobbyPlugin.java create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/handler/LobbyReconnectHandler.java create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/MainListener.java create mode 100644 hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/ServiceListener.java create mode 100644 hamster-lobby/src/main/resources/bungee.yml create mode 100644 hamster-lobby/src/main/resources/plugin.yml create mode 100644 hamster-spawn/build.gradle create mode 100644 hamster-spawn/src/main/java/cn/hamster3/mc/plugin/spawn/SpawnPlugin.java create mode 100644 hamster-spawn/src/main/resources/config.yml create mode 100644 hamster-spawn/src/main/resources/plugin.yml diff --git a/build.gradle b/build.gradle index 306fae7..f98a2c0 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ subprojects { //noinspection VulnerableLibrariesLocal compileOnly "org.spigotmc:spigot-api:${spigot_api_version}" //noinspection VulnerableLibrariesLocal - compileOnly "net.md-5:bungeecord-api:${bungee_api_version}" + compileOnly "net.md-5:bungeecord-api:${bungeecord_api_version}" } tasks.withType(JavaCompile).configureEach { diff --git a/gradle.properties b/gradle.properties index 06d4bab..2e53b88 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx2G spigot_api_version=1.12.2-R0.1-SNAPSHOT -bungee_api_version=1.19-R0.1-SNAPSHOT +bungeecord_api_version=1.19-R0.1-SNAPSHOT hamster_core_version=1.0.0-SNAPSHOT hamster_ball_version=1.0.0-SNAPSHOT placeholder_api_version=2.11.2 \ No newline at end of file diff --git a/hamster-lobby/README.md b/hamster-lobby/README.md new file mode 100644 index 0000000..cac68d5 --- /dev/null +++ b/hamster-lobby/README.md @@ -0,0 +1,35 @@ +# 基本介绍 + +项目中文名称:仓鼠大厅 +项目英文名称:HamsterLobby +服务端版本:paper-1.19.2 +对接人:叁只仓鼠 +联系方式:QQ 767089578 + +# 项目需求 + +该插件同时可以安装在游戏服务端以及代理服务端 +安装在游戏服务端时: + +- 插件会在服务端启动时广播当前服务器的 ip 以及端口 +- 可以阻止玩家对地图的破坏 +- 隐藏玩家的加入/退出消息 +- 拥有一个设置出生点的指令 +- 玩家在进入服务器时,自动将玩家传送至出生点 +- 玩家重生时,自动将玩家传送至出生点 + +安装在代理服务端时: + +- 插件会在收到游戏服务端插件广播的ip和端口之后,将这些ip和端口添加到代理端的链接配置中 +- 游戏服务端关闭时,将这个服务端从代理端的链接配置中移除 +- 玩家被子服踢出时,自动将玩家传送至大厅服。若被大厅服踢出,则断开与玩家的链接 + +# 指令列表 + +| 指令 | 权限 | 描述 | +|:------------------------|:-----------------------|:--------------| +| /hamster-lobby setspawn | hamster.lobby.setspawn | 将当前位置设置为大厅出生点 | + +# PlaceholderAPI + +无要求 diff --git a/hamster-lobby/build.gradle b/hamster-lobby/build.gradle new file mode 100644 index 0000000..b0f2af9 --- /dev/null +++ b/hamster-lobby/build.gradle @@ -0,0 +1,10 @@ +version '1.0.0-SNAPSHOT' +setArchivesBaseName("HamsterLobby") + +dependencies { + //noinspection VulnerableLibrariesLocal + compileOnly "net.md-5:bungeecord-api:${bungeecord_api_version}" + + compileOnly "cn.hamster3.mc.plugin.core:bukkit:${hamster_core_version}" + compileOnly "cn.hamster3.mc.plugin.ball:bukkit:${hamster_ball_version}" +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/LobbyPlugin.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/LobbyPlugin.java new file mode 100644 index 0000000..8c3bff5 --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/LobbyPlugin.java @@ -0,0 +1,29 @@ +package cn.hamster3.mc.plugin.lobby.bukkit; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.lobby.bukkit.listener.MainListener; +import cn.hamster3.mc.plugin.lobby.bukkit.listener.ProtectListener; +import cn.hamster3.mc.plugin.lobby.bukkit.listener.ServiceListener; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +public class LobbyPlugin extends JavaPlugin { + private static LobbyPlugin instance; + + public static LobbyPlugin getInstance() { + return instance; + } + + @Override + public void onLoad() { + instance = this; + BallAPI.getInstance().addListener(ServiceListener.INSTANCE); + } + + @Override + public void onEnable() { + Bukkit.getPluginManager().registerEvents(MainListener.INSTANCE, this); + Bukkit.getPluginManager().registerEvents(ProtectListener.INSTANCE, this); + BallAPI.getInstance().sendBallMessage("HamsterLobby", "registerLobby"); + } +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/MainListener.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/MainListener.java new file mode 100644 index 0000000..805e220 --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/MainListener.java @@ -0,0 +1,18 @@ +package cn.hamster3.mc.plugin.lobby.bukkit.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; + +public class MainListener implements Listener { + public static final MainListener INSTANCE = new MainListener(); + + private MainListener() { + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onPlayerDeath(PlayerDeathEvent event) { + event.setDeathMessage(null); + } +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ProtectListener.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ProtectListener.java new file mode 100644 index 0000000..de9a293 --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ProtectListener.java @@ -0,0 +1,104 @@ +package cn.hamster3.mc.plugin.lobby.bukkit.listener; + +import org.bukkit.block.Container; +import org.bukkit.block.DoubleChest; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.entity.EntityTameEvent; +import org.bukkit.event.entity.PlayerLeashEntityEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerPickupArrowEvent; +import org.bukkit.inventory.InventoryHolder; + +public class ProtectListener implements Listener { + public static final ProtectListener INSTANCE = new ProtectListener(); + + private ProtectListener() { + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onBlockBreak(BlockBreakEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onBlockPlace(BlockPlaceEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onBlockExplode(BlockExplodeEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onBlockBurn(BlockBurnEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onBlockFade(BlockFadeEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onLeavesDecay(LeavesDecayEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onBlockSpread(BlockSpreadEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onEntityTame(EntityTameEvent event) { + event.setCancelled(false); + } + + @EventHandler(ignoreCancelled = true) + public void onProjectileLaunch(ProjectileLaunchEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onEntityPickupItem(EntityPickupItemEvent event) { + if (event.getEntity().getType() != EntityType.PLAYER) { + return; + } + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onInventoryOpen(InventoryOpenEvent event) { + InventoryHolder holder = event.getInventory().getHolder(); + if (holder instanceof DoubleChest) { + event.setCancelled(true); + return; + } + if (holder instanceof Container) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerDropItem(PlayerDropItemEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerLeashEntity(PlayerLeashEntityEvent event) { + event.setCancelled(true); + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerPickupArrow(PlayerPickupArrowEvent event) { + event.setCancelled(true); + } +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ServiceListener.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ServiceListener.java new file mode 100644 index 0000000..46c2d68 --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bukkit/listener/ServiceListener.java @@ -0,0 +1,26 @@ +package cn.hamster3.mc.plugin.lobby.bukkit.listener; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerInfo; +import cn.hamster3.mc.plugin.ball.common.entity.BallServerType; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; +import cn.hamster3.mc.plugin.ball.common.listener.BallListener; +import cn.hamster3.mc.plugin.lobby.bukkit.LobbyPlugin; +import org.jetbrains.annotations.NotNull; + +public class ServiceListener implements BallListener { + public static final ServiceListener INSTANCE = new ServiceListener(); + + private ServiceListener() { + } + + @Override + public void onServerOnline(@NotNull ServerOnlineEvent event) { + BallServerInfo info = event.getServerInfo(); + if (info.getType() != BallServerType.PROXY) { + return; + } + BallAPI.getInstance().sendBallMessage("HamsterLobby", "registerLobby"); + LobbyPlugin.getInstance().getLogger().info("代理端 " + info.getName() + " 已上线,发送大厅服注册消息。"); + } +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/LobbyPlugin.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/LobbyPlugin.java new file mode 100644 index 0000000..083d5d3 --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/LobbyPlugin.java @@ -0,0 +1,31 @@ +package cn.hamster3.mc.plugin.lobby.bungee; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.lobby.bungee.handler.LobbyReconnectHandler; +import cn.hamster3.mc.plugin.lobby.bungee.listener.MainListener; +import cn.hamster3.mc.plugin.lobby.bungee.listener.ServiceListener; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Plugin; + +import java.util.HashSet; + +public class LobbyPlugin extends Plugin { + public static final HashSet LOBBY_SERVERS = new HashSet<>(); + private static LobbyPlugin instance; + + public static LobbyPlugin getInstance() { + return instance; + } + + @Override + public void onLoad() { + instance = this; + } + + @Override + public void onEnable() { + BallAPI.getInstance().addListener(ServiceListener.INSTANCE); + ProxyServer.getInstance().setReconnectHandler(LobbyReconnectHandler.INSTANCE); + ProxyServer.getInstance().getPluginManager().registerListener(this, MainListener.INSTANCE); + } +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/handler/LobbyReconnectHandler.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/handler/LobbyReconnectHandler.java new file mode 100644 index 0000000..51de8d1 --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/handler/LobbyReconnectHandler.java @@ -0,0 +1,48 @@ +package cn.hamster3.mc.plugin.lobby.bungee.handler; + +import cn.hamster3.mc.plugin.ball.common.api.BallAPI; +import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; +import cn.hamster3.mc.plugin.lobby.bungee.LobbyPlugin; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.ReconnectHandler; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +import java.util.Comparator; +import java.util.Map; + +public class LobbyReconnectHandler implements ReconnectHandler { + public static final LobbyReconnectHandler INSTANCE = new LobbyReconnectHandler(); + + private LobbyReconnectHandler() { + } + + @Override + public ServerInfo getServer(ProxiedPlayer player) { + BallPlayerInfo playerInfo = BallAPI.getInstance().getPlayerInfo(player.getUniqueId()); + if (playerInfo != null) { + ServerInfo info = ProxyServer.getInstance().getServerInfo(playerInfo.getGameServer()); + if (info != null) { + return info; + } + } + return ProxyServer.getInstance().getServers().entrySet() + .stream() + .filter(o -> LobbyPlugin.LOBBY_SERVERS.contains(o.getKey())) + .map(Map.Entry::getValue) + .min(Comparator.comparingInt(o -> o.getPlayers().size())) + .orElse(null); + } + + @Override + public void setServer(ProxiedPlayer player) { + } + + @Override + public void save() { + } + + @Override + public void close() { + } +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/MainListener.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/MainListener.java new file mode 100644 index 0000000..1a4f5dc --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/MainListener.java @@ -0,0 +1,59 @@ +package cn.hamster3.mc.plugin.lobby.bungee.listener; + +import cn.hamster3.mc.plugin.lobby.bungee.LobbyPlugin; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.event.ServerKickEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; + +import java.util.Comparator; +import java.util.Map; +import java.util.logging.Logger; + +public class MainListener implements Listener { + public static final MainListener INSTANCE = new MainListener(); + + private MainListener() { + } + + @EventHandler + public void onServerKick(ServerKickEvent event) { + if (event.getState() != ServerKickEvent.State.CONNECTED) { + return; + } + Logger logger = LobbyPlugin.getInstance().getLogger(); + String kickServerName = event.getKickedFrom().getName(); + if (LobbyPlugin.LOBBY_SERVERS.contains(kickServerName)) { + logger.info(String.format( + "玩家 %s 被大厅服务器 %s 踢出. 断开与玩家的连接.", + event.getPlayer().getName(), + kickServerName + )); + return; + } + ServerInfo lobbyServer = ProxyServer.getInstance().getServers().entrySet() + .stream() + .filter(o -> LobbyPlugin.LOBBY_SERVERS.contains(o.getKey())) + .map(Map.Entry::getValue) + .min(Comparator.comparingInt(o -> o.getPlayers().size())) + .orElse(null); + if (lobbyServer == null) { + logger.info(String.format( + "玩家 %s 被服务器 %s 踢出. 由于找不到大厅服务器而断开与玩家的连接.", + event.getPlayer().getName(), + kickServerName + )); + return; + } + event.setCancelServer(lobbyServer); + event.setCancelled(true); + logger.info(String.format( + "玩家 %s 被服务器 %s 踢出. 将玩家重新连接至大厅服务器 %s.", + event.getPlayer().getName(), + kickServerName, + lobbyServer.getName() + )); + } + +} diff --git a/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/ServiceListener.java b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/ServiceListener.java new file mode 100644 index 0000000..bb43401 --- /dev/null +++ b/hamster-lobby/src/main/java/cn/hamster3/mc/plugin/lobby/bungee/listener/ServiceListener.java @@ -0,0 +1,40 @@ +package cn.hamster3.mc.plugin.lobby.bungee.listener; + +import cn.hamster3.mc.plugin.ball.common.data.BallMessageInfo; +import cn.hamster3.mc.plugin.ball.common.event.server.ServerOfflineEvent; +import cn.hamster3.mc.plugin.ball.common.listener.BallListener; +import cn.hamster3.mc.plugin.lobby.bungee.LobbyPlugin; +import org.jetbrains.annotations.NotNull; + +public class ServiceListener implements BallListener { + public static final ServiceListener INSTANCE = new ServiceListener(); + + private ServiceListener() { + } + + @Override + public void onMessageReceived(@NotNull BallMessageInfo event) { + if (!"HamsterLobby".equals(event.getChannel())) { + return; + } + switch (event.getAction()) { + case "registerLobby": { + String senderID = event.getSenderID(); + LobbyPlugin.LOBBY_SERVERS.add(senderID); + LobbyPlugin.getInstance().getLogger().info("已添加大厅服务器: " + senderID); + break; + } + case "": { + break; + } + } + } + + @Override + public void onServerOffline(@NotNull ServerOfflineEvent event) { + String serverID = event.getServerID(); + if (LobbyPlugin.LOBBY_SERVERS.remove(serverID)) { + LobbyPlugin.getInstance().getLogger().info("已移除大厅服务器: " + serverID); + } + } +} diff --git a/hamster-lobby/src/main/resources/bungee.yml b/hamster-lobby/src/main/resources/bungee.yml new file mode 100644 index 0000000..bd8096e --- /dev/null +++ b/hamster-lobby/src/main/resources/bungee.yml @@ -0,0 +1,5 @@ +name: HamsterLobby +main: cn.hamster3.mc.plugin.lobby.bungee.LobbyPlugin +version: ${version} + +author: MiniDay diff --git a/hamster-lobby/src/main/resources/plugin.yml b/hamster-lobby/src/main/resources/plugin.yml new file mode 100644 index 0000000..fa25ccf --- /dev/null +++ b/hamster-lobby/src/main/resources/plugin.yml @@ -0,0 +1,12 @@ +name: HamsterLobby +main: cn.hamster3.mc.plugin.lobby.bukkit.LobbyPlugin +version: ${version} +api-version: 1.13 + +author: MiniDay +website: https://github.com/MiniDay/hamster-little-plugins +description: 仓鼠大厅 + +depend: + - HamsterCore + - HamsterBall diff --git a/hamster-spawn/build.gradle b/hamster-spawn/build.gradle new file mode 100644 index 0000000..ce58739 --- /dev/null +++ b/hamster-spawn/build.gradle @@ -0,0 +1,10 @@ +version '1.0.0-SNAPSHOT' +setArchivesBaseName("HamsterSpawn") + +dependencies { + //noinspection VulnerableLibrariesLocal + compileOnly "net.md-5:bungeecord-api:${bungeecord_api_version}" + + compileOnly "cn.hamster3.mc.plugin.core:bukkit:${hamster_core_version}" + compileOnly "cn.hamster3.mc.plugin.ball:bukkit:${hamster_ball_version}" +} diff --git a/hamster-spawn/src/main/java/cn/hamster3/mc/plugin/spawn/SpawnPlugin.java b/hamster-spawn/src/main/java/cn/hamster3/mc/plugin/spawn/SpawnPlugin.java new file mode 100644 index 0000000..2b214e0 --- /dev/null +++ b/hamster-spawn/src/main/java/cn/hamster3/mc/plugin/spawn/SpawnPlugin.java @@ -0,0 +1,50 @@ +package cn.hamster3.mc.plugin.spawn; + +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.plugin.java.JavaPlugin; + +public class SpawnPlugin extends JavaPlugin implements Listener { + private Location spawnLocation; + + @Override + public void onEnable() { + FileConfiguration config = getConfig(); + if (config.contains("spawn-location")) { + spawnLocation = (Location) config.get("spawn-location"); + } + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (sender.hasPermission("hamster.spawn.admin")) { + sender.sendMessage("§c你没有这个权限!"); + return true; + } + if (!(sender instanceof Player)) { + sender.sendMessage("§c这个命令只能由玩家执行!"); + return true; + } + Player player = (Player) sender; + spawnLocation = player.getLocation(); + getConfig().set("spawn-location", spawnLocation); + saveConfig(); + sender.sendMessage("§a已设定出生点!"); + return true; + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerJoin(PlayerJoinEvent event) { + if (spawnLocation == null) { + return; + } + event.getPlayer().teleport(spawnLocation, PlayerTeleportEvent.TeleportCause.PLUGIN); + } +} diff --git a/hamster-spawn/src/main/resources/config.yml b/hamster-spawn/src/main/resources/config.yml new file mode 100644 index 0000000..e69de29 diff --git a/hamster-spawn/src/main/resources/plugin.yml b/hamster-spawn/src/main/resources/plugin.yml new file mode 100644 index 0000000..363709f --- /dev/null +++ b/hamster-spawn/src/main/resources/plugin.yml @@ -0,0 +1,18 @@ +name: HamsterSpawn +main: cn.hamster3.mc.plugin.spawn.SpawnPlugin +version: ${version} +api-version: 1.13 + +author: MiniDay +website: https://github.com/MiniDay/hamster-little-plugins +description: 设定出生点 + + +commands: + set-spawn: + aliases: [ setspawn ] + description: 设置出生点 + +permissions: + hamster.spawn.admin: + default: op diff --git a/settings.gradle b/settings.gradle index b14fd96..9831172 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,3 +6,6 @@ include 'hamster-auto-ore-remove' include 'hamster-auto-server-info' include 'hamster-ball-bridge' include 'hamster-sudo' +include 'hamster-lobby' +include 'hamster-spawn' +