feat: 完成新项目

This commit is contained in:
2023-05-10 19:27:46 +08:00
parent 43737463a7
commit c51bd60676
19 changed files with 500 additions and 2 deletions

35
hamster-lobby/README.md Normal file
View File

@@ -0,0 +1,35 @@
# 基本介绍
项目中文名称:仓鼠大厅
项目英文名称HamsterLobby
服务端版本paper-1.19.2
对接人:叁只仓鼠
联系方式QQ 767089578
# 项目需求
该插件同时可以安装在游戏服务端以及代理服务端
安装在游戏服务端时:
- 插件会在服务端启动时广播当前服务器的 ip 以及端口
- 可以阻止玩家对地图的破坏
- 隐藏玩家的加入/退出消息
- 拥有一个设置出生点的指令
- 玩家在进入服务器时,自动将玩家传送至出生点
- 玩家重生时,自动将玩家传送至出生点
安装在代理服务端时:
- 插件会在收到游戏服务端插件广播的ip和端口之后将这些ip和端口添加到代理端的链接配置中
- 游戏服务端关闭时,将这个服务端从代理端的链接配置中移除
- 玩家被子服踢出时,自动将玩家传送至大厅服。若被大厅服踢出,则断开与玩家的链接
# 指令列表
| 指令 | 权限 | 描述 |
|:------------------------|:-----------------------|:--------------|
| /hamster-lobby setspawn | hamster.lobby.setspawn | 将当前位置设置为大厅出生点 |
# PlaceholderAPI
无要求

View 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}"
}

View File

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

View File

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

View File

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

View File

@@ -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() + " 已上线,发送大厅服注册消息。");
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,5 @@
name: HamsterLobby
main: cn.hamster3.mc.plugin.lobby.bungee.LobbyPlugin
version: ${version}
author: MiniDay

View 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