mirror of
https://github.com/WiIIiam278/HuskSync.git
synced 2025-12-23 08:39:19 +00:00
feat: added PacketEvents support as ProtocolLib alternative (#296)
This commit is contained in:
@@ -13,6 +13,7 @@ dependencies {
|
|||||||
implementation 'de.tr7zw:item-nbt-api:2.12.4'
|
implementation 'de.tr7zw:item-nbt-api:2.12.4'
|
||||||
|
|
||||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||||
|
compileOnly 'com.github.retrooper.packetevents:spigot:2.2.1'
|
||||||
compileOnly 'com.comphenix.protocol:ProtocolLib:5.1.0'
|
compileOnly 'com.comphenix.protocol:ProtocolLib:5.1.0'
|
||||||
compileOnly 'org.projectlombok:lombok:1.18.32'
|
compileOnly 'org.projectlombok:lombok:1.18.32'
|
||||||
compileOnly 'commons-io:commons-io:2.16.1'
|
compileOnly 'commons-io:commons-io:2.16.1'
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ import net.william278.husksync.database.PostgresDatabase;
|
|||||||
import net.william278.husksync.event.BukkitEventDispatcher;
|
import net.william278.husksync.event.BukkitEventDispatcher;
|
||||||
import net.william278.husksync.hook.PlanHook;
|
import net.william278.husksync.hook.PlanHook;
|
||||||
import net.william278.husksync.listener.BukkitEventListener;
|
import net.william278.husksync.listener.BukkitEventListener;
|
||||||
import net.william278.husksync.listener.EventListener;
|
|
||||||
import net.william278.husksync.migrator.LegacyMigrator;
|
import net.william278.husksync.migrator.LegacyMigrator;
|
||||||
import net.william278.husksync.migrator.Migrator;
|
import net.william278.husksync.migrator.Migrator;
|
||||||
import net.william278.husksync.migrator.MpdbMigrator;
|
import net.william278.husksync.migrator.MpdbMigrator;
|
||||||
@@ -98,7 +97,7 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync, BukkitTask.S
|
|||||||
private MorePaperLib paperLib;
|
private MorePaperLib paperLib;
|
||||||
private Database database;
|
private Database database;
|
||||||
private RedisManager redisManager;
|
private RedisManager redisManager;
|
||||||
private EventListener eventListener;
|
private BukkitEventListener eventListener;
|
||||||
private DataAdapter dataAdapter;
|
private DataAdapter dataAdapter;
|
||||||
private DataSyncer dataSyncer;
|
private DataSyncer dataSyncer;
|
||||||
private LegacyConverter legacyConverter;
|
private LegacyConverter legacyConverter;
|
||||||
@@ -113,11 +112,10 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync, BukkitTask.S
|
|||||||
private Server serverName;
|
private Server serverName;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onLoad() {
|
||||||
// Initial plugin setup
|
// Initial plugin setup
|
||||||
this.disabling = false;
|
this.disabling = false;
|
||||||
this.gson = createGson();
|
this.gson = createGson();
|
||||||
this.audiences = BukkitAudiences.create(this);
|
|
||||||
this.paperLib = new MorePaperLib(this);
|
this.paperLib = new MorePaperLib(this);
|
||||||
|
|
||||||
// Load settings and locales
|
// Load settings and locales
|
||||||
@@ -127,6 +125,13 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync, BukkitTask.S
|
|||||||
loadServer();
|
loadServer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.eventListener = createEventListener();
|
||||||
|
eventListener.onLoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
this.audiences = BukkitAudiences.create(this);
|
||||||
// Prepare data adapter
|
// Prepare data adapter
|
||||||
initialize("data adapter", (plugin) -> {
|
initialize("data adapter", (plugin) -> {
|
||||||
if (settings.getSynchronization().isCompressData()) {
|
if (settings.getSynchronization().isCompressData()) {
|
||||||
@@ -185,7 +190,7 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync, BukkitTask.S
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Register events
|
// Register events
|
||||||
initialize("events", (plugin) -> this.eventListener = createEventListener());
|
initialize("events", (plugin) -> eventListener.onEnable());
|
||||||
|
|
||||||
// Register commands
|
// Register commands
|
||||||
initialize("commands", (plugin) -> BukkitCommand.Type.registerCommands(this));
|
initialize("commands", (plugin) -> BukkitCommand.Type.registerCommands(this));
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
package net.william278.husksync.listener;
|
package net.william278.husksync.listener;
|
||||||
|
|
||||||
import net.william278.husksync.BukkitHuskSync;
|
import net.william278.husksync.BukkitHuskSync;
|
||||||
import net.william278.husksync.HuskSync;
|
|
||||||
import net.william278.husksync.data.BukkitData;
|
import net.william278.husksync.data.BukkitData;
|
||||||
import net.william278.husksync.user.BukkitUser;
|
import net.william278.husksync.user.BukkitUser;
|
||||||
import net.william278.husksync.user.OnlineUser;
|
import net.william278.husksync.user.OnlineUser;
|
||||||
@@ -40,21 +39,38 @@ import java.util.stream.Collectors;
|
|||||||
public class BukkitEventListener extends EventListener implements BukkitJoinEventListener, BukkitQuitEventListener,
|
public class BukkitEventListener extends EventListener implements BukkitJoinEventListener, BukkitQuitEventListener,
|
||||||
BukkitDeathEventListener, Listener {
|
BukkitDeathEventListener, Listener {
|
||||||
|
|
||||||
protected final LockedHandler lockedHandler;
|
protected LockedHandler lockedHandler;
|
||||||
|
|
||||||
public BukkitEventListener(@NotNull BukkitHuskSync plugin) {
|
public BukkitEventListener(@NotNull BukkitHuskSync plugin) {
|
||||||
super(plugin);
|
super(plugin);
|
||||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
}
|
||||||
this.lockedHandler = createLockedHandler(plugin);
|
|
||||||
|
public void onLoad() {
|
||||||
|
this.lockedHandler = createLockedHandler((BukkitHuskSync) plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEnable() {
|
||||||
|
getPlugin().getServer().getPluginManager().registerEvents(this, getPlugin());
|
||||||
|
lockedHandler.onEnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handlePluginDisable() {
|
||||||
|
super.handlePluginDisable();
|
||||||
|
lockedHandler.onDisable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private LockedHandler createLockedHandler(@NotNull BukkitHuskSync plugin) {
|
private LockedHandler createLockedHandler(@NotNull BukkitHuskSync plugin) {
|
||||||
if (getPlugin().isDependencyLoaded("ProtocolLib") && getPlugin().getSettings().isCancelPackets()) {
|
if (!getPlugin().getSettings().isCancelPackets()) {
|
||||||
return new BukkitLockedPacketListener(plugin);
|
|
||||||
} else {
|
|
||||||
return new BukkitLockedEventListener(plugin);
|
return new BukkitLockedEventListener(plugin);
|
||||||
}
|
}
|
||||||
|
if (getPlugin().isDependencyLoaded("PacketEvents")) {
|
||||||
|
return new BukkitPacketEventsLockedPacketListener(plugin);
|
||||||
|
} else if (getPlugin().isDependencyLoaded("ProtocolLib")) {
|
||||||
|
return new BukkitProtocolLibLockedPacketListener(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BukkitLockedEventListener(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -134,8 +150,8 @@ public class BukkitEventListener extends EventListener implements BukkitJoinEven
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public HuskSync getPlugin() {
|
public BukkitHuskSync getPlugin() {
|
||||||
return plugin;
|
return (BukkitHuskSync) plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,10 @@ public class BukkitLockedEventListener implements LockedHandler, Listener {
|
|||||||
|
|
||||||
protected BukkitLockedEventListener(@NotNull BukkitHuskSync plugin) {
|
protected BukkitLockedEventListener(@NotNull BukkitHuskSync plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of HuskSync, licensed under the Apache License 2.0.
|
||||||
|
*
|
||||||
|
* Copyright (c) William278 <will27528@gmail.com>
|
||||||
|
* Copyright (c) contributors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.william278.husksync.listener;
|
||||||
|
|
||||||
|
import com.github.retrooper.packetevents.PacketEvents;
|
||||||
|
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||||
|
import com.github.retrooper.packetevents.event.PacketListenerPriority;
|
||||||
|
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
|
||||||
|
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
|
||||||
|
import net.william278.husksync.BukkitHuskSync;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
public class BukkitPacketEventsLockedPacketListener extends BukkitLockedEventListener implements LockedHandler {
|
||||||
|
|
||||||
|
protected BukkitPacketEventsLockedPacketListener(@NotNull BukkitHuskSync plugin) {
|
||||||
|
super(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoad() {
|
||||||
|
super.onLoad();
|
||||||
|
PacketEvents.setAPI(SpigotPacketEventsBuilder.build(getPlugin()));
|
||||||
|
PacketEvents.getAPI().getSettings().reEncodeByDefault(false)
|
||||||
|
.checkForUpdates(false)
|
||||||
|
.bStats(true);
|
||||||
|
PacketEvents.getAPI().load();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
super.onEnable();
|
||||||
|
PacketEvents.getAPI().getEventManager().registerListener(new PlayerPacketAdapter(this));
|
||||||
|
PacketEvents.getAPI().init();
|
||||||
|
plugin.log(Level.INFO, "Using PacketEvents to cancel packets for locked players");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class PlayerPacketAdapter extends PacketListenerAbstract {
|
||||||
|
|
||||||
|
private static final Set<PacketType.Play.Client> ALLOWED_PACKETS = Set.of(
|
||||||
|
PacketType.Play.Client.KEEP_ALIVE, PacketType.Play.Client.PONG, PacketType.Play.Client.PLUGIN_MESSAGE, // Connection packets
|
||||||
|
PacketType.Play.Client.CHAT_MESSAGE, PacketType.Play.Client.CHAT_COMMAND, PacketType.Play.Client.CHAT_SESSION_UPDATE, // Chat / command packets
|
||||||
|
PacketType.Play.Client.PLAYER_POSITION, PacketType.Play.Client.PLAYER_POSITION_AND_ROTATION, PacketType.Play.Client.PLAYER_ROTATION, // Movement packets
|
||||||
|
PacketType.Play.Client.HELD_ITEM_CHANGE, PacketType.Play.Client.ANIMATION, PacketType.Play.Client.TELEPORT_CONFIRM, // Animation packets
|
||||||
|
PacketType.Play.Client.CLIENT_SETTINGS // Video setting packets
|
||||||
|
);
|
||||||
|
|
||||||
|
private static final Set<PacketType.Play.Client> CANCEL_PACKETS = getPacketsToListenFor();
|
||||||
|
|
||||||
|
|
||||||
|
private final BukkitPacketEventsLockedPacketListener listener;
|
||||||
|
|
||||||
|
public PlayerPacketAdapter(@NotNull BukkitPacketEventsLockedPacketListener listener) {
|
||||||
|
super(PacketListenerPriority.HIGH);
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPacketReceive(PacketReceiveEvent event) {
|
||||||
|
if(!(event.getPacketType() instanceof PacketType.Play.Client client)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!CANCEL_PACKETS.contains(client)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (listener.cancelPlayerEvent(event.getUser().getUUID())) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the set of ALL Server packets, excluding the set of allowed packets
|
||||||
|
@NotNull
|
||||||
|
private static Set<PacketType.Play.Client> getPacketsToListenFor() {
|
||||||
|
return Sets.difference(
|
||||||
|
Sets.newHashSet(PacketType.Play.Client.values()),
|
||||||
|
ALLOWED_PACKETS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -34,10 +34,15 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
import static com.comphenix.protocol.PacketType.Play.Client;
|
import static com.comphenix.protocol.PacketType.Play.Client;
|
||||||
|
|
||||||
public class BukkitLockedPacketListener extends BukkitLockedEventListener implements LockedHandler {
|
public class BukkitProtocolLibLockedPacketListener extends BukkitLockedEventListener implements LockedHandler {
|
||||||
|
|
||||||
protected BukkitLockedPacketListener(@NotNull BukkitHuskSync plugin) {
|
protected BukkitProtocolLibLockedPacketListener(@NotNull BukkitHuskSync plugin) {
|
||||||
super(plugin);
|
super(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
super.onEnable();
|
||||||
ProtocolLibrary.getProtocolManager().addPacketListener(new PlayerPacketAdapter(this));
|
ProtocolLibrary.getProtocolManager().addPacketListener(new PlayerPacketAdapter(this));
|
||||||
plugin.log(Level.INFO, "Using ProtocolLib to cancel packets for locked players");
|
plugin.log(Level.INFO, "Using ProtocolLib to cancel packets for locked players");
|
||||||
}
|
}
|
||||||
@@ -53,9 +58,9 @@ public class BukkitLockedPacketListener extends BukkitLockedEventListener implem
|
|||||||
Client.SETTINGS // Video setting packets
|
Client.SETTINGS // Video setting packets
|
||||||
);
|
);
|
||||||
|
|
||||||
private final BukkitLockedPacketListener listener;
|
private final BukkitProtocolLibLockedPacketListener listener;
|
||||||
|
|
||||||
public PlayerPacketAdapter(@NotNull BukkitLockedPacketListener listener) {
|
public PlayerPacketAdapter(@NotNull BukkitProtocolLibLockedPacketListener listener) {
|
||||||
super(listener.getPlugin(), ListenerPriority.HIGHEST, getPacketsToListenFor());
|
super(listener.getPlugin(), ListenerPriority.HIGHEST, getPacketsToListenFor());
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ description: '${description}'
|
|||||||
website: 'https://william278.net'
|
website: 'https://william278.net'
|
||||||
folia-supported: true
|
folia-supported: true
|
||||||
softdepend:
|
softdepend:
|
||||||
|
- 'packetevents'
|
||||||
- 'ProtocolLib'
|
- 'ProtocolLib'
|
||||||
- 'MysqlPlayerDataBridge'
|
- 'MysqlPlayerDataBridge'
|
||||||
- 'Plan'
|
- 'Plan'
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public abstract class EventListener {
|
|||||||
/**
|
/**
|
||||||
* Handle the plugin disabling
|
* Handle the plugin disabling
|
||||||
*/
|
*/
|
||||||
public final void handlePluginDisable() {
|
public void handlePluginDisable() {
|
||||||
// Save for all online players
|
// Save for all online players
|
||||||
plugin.getOnlineUsers().stream()
|
plugin.getOnlineUsers().stream()
|
||||||
.filter(user -> !plugin.isLocked(user.getUuid()) && !user.isNpc())
|
.filter(user -> !plugin.isLocked(user.getUuid()) && !user.isNpc())
|
||||||
|
|||||||
@@ -54,4 +54,16 @@ public interface LockedHandler {
|
|||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
HuskSync getPlugin();
|
HuskSync getPlugin();
|
||||||
|
|
||||||
|
default void onLoad() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
default void onEnable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
default void onDisable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ api-version: '1.19'
|
|||||||
folia-supported: true
|
folia-supported: true
|
||||||
dependencies:
|
dependencies:
|
||||||
server:
|
server:
|
||||||
|
packetevents:
|
||||||
|
required: false
|
||||||
|
load: BEFORE
|
||||||
|
join-classpath: true
|
||||||
ProtocolLib:
|
ProtocolLib:
|
||||||
required: false
|
required: false
|
||||||
load: BEFORE
|
load: BEFORE
|
||||||
|
|||||||
Reference in New Issue
Block a user