Skip to content

Commit 3210664

Browse files
修复peek状态下的观察者传送
由于folia没有teleport event,所以采用拦截发包
1 parent a795c41 commit 3210664

4 files changed

Lines changed: 70 additions & 4 deletions

File tree

pom.xml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77
<groupId>ict.minesunshineone</groupId>
88
<artifactId>peek</artifactId>
9-
<version>2.8</version>
9+
<version>2.9</version>
1010

1111
<properties>
12-
<maven.compiler.release>21</maven.compiler.release>
12+
<maven.compiler.release>17</maven.compiler.release>
1313
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1414
</properties>
1515

@@ -23,6 +23,10 @@
2323
<id>papermc</id>
2424
<url>https://repo.papermc.io/repository/maven-public/</url>
2525
</repository>
26+
<repository>
27+
<id>dmulloy2-repo</id>
28+
<url>https://repo.dmulloy2.net/repository/public/</url>
29+
</repository>
2630
</repositories>
2731

2832
<dependencies>
@@ -44,7 +48,12 @@
4448
<version>2.11.6</version>
4549
<scope>provided</scope>
4650
</dependency>
47-
51+
<dependency>
52+
<groupId>com.comphenix.protocol</groupId>
53+
<artifactId>ProtocolLib</artifactId>
54+
<version>5.3.0</version>
55+
<scope>provided</scope>
56+
</dependency>
4857
</dependencies>
4958

5059
<build>

src/main/java/ict/minesunshineone/peek/PeekPlugin.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import ict.minesunshineone.peek.handler.PeekTargetHandler;
1414
import ict.minesunshineone.peek.listener.PeekInteractionListener;
1515
import ict.minesunshineone.peek.listener.PeekListener;
16+
import ict.minesunshineone.peek.listener.PeekPacketListener;
1617
import ict.minesunshineone.peek.manager.CooldownManager;
1718
import ict.minesunshineone.peek.manager.PrivacyManager;
1819
import ict.minesunshineone.peek.manager.StateManager;
@@ -32,6 +33,7 @@ public class PeekPlugin extends JavaPlugin {
3233
private CooldownManager cooldownManager;
3334
private PrivacyManager privacyManager;
3435
private StatisticsManager statisticsManager;
36+
private PeekPacketListener packetListener;
3537

3638
@Override
3739
public void onEnable() {
@@ -48,6 +50,12 @@ public void onEnable() {
4850
this.privacyManager = new PrivacyManager(this);
4951
this.statisticsManager = new StatisticsManager(this);
5052

53+
// 如果服务器有ProtocolLib,初始化数据包监听器
54+
if (getServer().getPluginManager().getPlugin("ProtocolLib") != null) {
55+
this.packetListener = new PeekPacketListener(this);
56+
getLogger().info("已启用ProtocolLib支持!");
57+
}
58+
5159
// 注册命令
5260
PeekCommand peekCommand = new PeekCommand(this);
5361
var cmd = getCommand("peek");
@@ -89,6 +97,10 @@ public void onDisable() {
8997
privacyManager.savePrivacyStates();
9098
}
9199

100+
if (packetListener != null) {
101+
packetListener.unregisterPacketListeners();
102+
}
103+
92104
getLogger().info("Peek插件已禁用!");
93105
}
94106

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package ict.minesunshineone.peek.listener;
2+
3+
import org.bukkit.GameMode;
4+
import org.bukkit.entity.Player;
5+
6+
import com.comphenix.protocol.PacketType;
7+
import com.comphenix.protocol.ProtocolLibrary;
8+
import com.comphenix.protocol.ProtocolManager;
9+
import com.comphenix.protocol.events.PacketAdapter;
10+
import com.comphenix.protocol.events.PacketEvent;
11+
12+
import ict.minesunshineone.peek.PeekPlugin;
13+
14+
public class PeekPacketListener {
15+
16+
private final PeekPlugin plugin;
17+
private final ProtocolManager protocolManager;
18+
19+
public PeekPacketListener(PeekPlugin plugin) {
20+
this.plugin = plugin;
21+
this.protocolManager = ProtocolLibrary.getProtocolManager();
22+
registerPacketListeners();
23+
}
24+
25+
private void registerPacketListeners() {
26+
// 监听观察者模式传送数据包
27+
protocolManager.addPacketListener(new PacketAdapter(plugin, PacketType.Play.Client.SPECTATE) {
28+
@Override
29+
public void onPacketReceiving(PacketEvent event) {
30+
Player player = event.getPlayer();
31+
32+
// 检查玩家是否在peek状态
33+
if (((PeekPlugin) plugin).getStateHandler().getActivePeeks().containsKey(player.getUniqueId())
34+
&& player.getGameMode() == GameMode.SPECTATOR) {
35+
// 取消数据包,阻止传送
36+
event.setCancelled(true);
37+
}
38+
}
39+
});
40+
}
41+
42+
public void unregisterPacketListeners() {
43+
protocolManager.removePacketListeners(plugin);
44+
}
45+
}

src/main/resources/plugin.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ authors: [MineSunshineOne]
66
description: 一个允许玩家观察其他玩家的插件
77
website: https://github.com/MineSunshineOne/Peek
88
folia-supported: true
9-
softdepend: [PlaceholderAPI]
9+
softdepend: [PlaceholderAPI, ProtocolLib]
1010

1111
commands:
1212
peek:

0 commit comments

Comments
 (0)