feat: 完成新项目
This commit is contained in:
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
|
Reference in New Issue
Block a user