feat: 完成新项目
This commit is contained in:
@@ -34,7 +34,7 @@ subprojects {
|
|||||||
//noinspection VulnerableLibrariesLocal
|
//noinspection VulnerableLibrariesLocal
|
||||||
compileOnly "org.spigotmc:spigot-api:${spigot_api_version}"
|
compileOnly "org.spigotmc:spigot-api:${spigot_api_version}"
|
||||||
//noinspection VulnerableLibrariesLocal
|
//noinspection VulnerableLibrariesLocal
|
||||||
compileOnly "net.md-5:bungeecord-api:${bungee_api_version}"
|
compileOnly "net.md-5:bungeecord-api:${bungeecord_api_version}"
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
tasks.withType(JavaCompile).configureEach {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
org.gradle.jvmargs=-Xmx2G
|
org.gradle.jvmargs=-Xmx2G
|
||||||
|
|
||||||
spigot_api_version=1.12.2-R0.1-SNAPSHOT
|
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_core_version=1.0.0-SNAPSHOT
|
||||||
hamster_ball_version=1.0.0-SNAPSHOT
|
hamster_ball_version=1.0.0-SNAPSHOT
|
||||||
placeholder_api_version=2.11.2
|
placeholder_api_version=2.11.2
|
35
hamster-lobby/README.md
Normal file
35
hamster-lobby/README.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# 基本介绍
|
||||||
|
|
||||||
|
项目中文名称:仓鼠大厅
|
||||||
|
项目英文名称:HamsterLobby
|
||||||
|
服务端版本:paper-1.19.2
|
||||||
|
对接人:叁只仓鼠
|
||||||
|
联系方式:QQ 767089578
|
||||||
|
|
||||||
|
# 项目需求
|
||||||
|
|
||||||
|
该插件同时可以安装在游戏服务端以及代理服务端
|
||||||
|
安装在游戏服务端时:
|
||||||
|
|
||||||
|
- 插件会在服务端启动时广播当前服务器的 ip 以及端口
|
||||||
|
- 可以阻止玩家对地图的破坏
|
||||||
|
- 隐藏玩家的加入/退出消息
|
||||||
|
- 拥有一个设置出生点的指令
|
||||||
|
- 玩家在进入服务器时,自动将玩家传送至出生点
|
||||||
|
- 玩家重生时,自动将玩家传送至出生点
|
||||||
|
|
||||||
|
安装在代理服务端时:
|
||||||
|
|
||||||
|
- 插件会在收到游戏服务端插件广播的ip和端口之后,将这些ip和端口添加到代理端的链接配置中
|
||||||
|
- 游戏服务端关闭时,将这个服务端从代理端的链接配置中移除
|
||||||
|
- 玩家被子服踢出时,自动将玩家传送至大厅服。若被大厅服踢出,则断开与玩家的链接
|
||||||
|
|
||||||
|
# 指令列表
|
||||||
|
|
||||||
|
| 指令 | 权限 | 描述 |
|
||||||
|
|:------------------------|:-----------------------|:--------------|
|
||||||
|
| /hamster-lobby setspawn | hamster.lobby.setspawn | 将当前位置设置为大厅出生点 |
|
||||||
|
|
||||||
|
# PlaceholderAPI
|
||||||
|
|
||||||
|
无要求
|
10
hamster-lobby/build.gradle
Normal file
10
hamster-lobby/build.gradle
Normal file
@@ -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}"
|
||||||
|
}
|
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
@@ -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() + " 已上线,发送大厅服注册消息。");
|
||||||
|
}
|
||||||
|
}
|
@@ -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<String> 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);
|
||||||
|
}
|
||||||
|
}
|
@@ -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() {
|
||||||
|
}
|
||||||
|
}
|
@@ -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()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
hamster-lobby/src/main/resources/bungee.yml
Normal file
5
hamster-lobby/src/main/resources/bungee.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
name: HamsterLobby
|
||||||
|
main: cn.hamster3.mc.plugin.lobby.bungee.LobbyPlugin
|
||||||
|
version: ${version}
|
||||||
|
|
||||||
|
author: MiniDay
|
12
hamster-lobby/src/main/resources/plugin.yml
Normal file
12
hamster-lobby/src/main/resources/plugin.yml
Normal file
@@ -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
|
10
hamster-spawn/build.gradle
Normal file
10
hamster-spawn/build.gradle
Normal file
@@ -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}"
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
0
hamster-spawn/src/main/resources/config.yml
Normal file
0
hamster-spawn/src/main/resources/config.yml
Normal file
18
hamster-spawn/src/main/resources/plugin.yml
Normal file
18
hamster-spawn/src/main/resources/plugin.yml
Normal file
@@ -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
|
@@ -6,3 +6,6 @@ include 'hamster-auto-ore-remove'
|
|||||||
include 'hamster-auto-server-info'
|
include 'hamster-auto-server-info'
|
||||||
include 'hamster-ball-bridge'
|
include 'hamster-ball-bridge'
|
||||||
include 'hamster-sudo'
|
include 'hamster-sudo'
|
||||||
|
include 'hamster-lobby'
|
||||||
|
include 'hamster-spawn'
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user