Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cdc7ed36e0 | ||
|
|
5d63308a22 | ||
|
|
214706dbb6 | ||
|
|
fa3b563c70 | ||
|
|
55e31483e7 | ||
|
|
aa34910468 | ||
|
|
5e44913a5e | ||
|
|
b8dc964112 | ||
|
|
890844fb60 | ||
|
|
fc57c9e077 | ||
|
|
f12ef113aa | ||
|
|
e8144ece97 |
No files matched your search
@@ -1,15 +1,17 @@
|
||||
# packetevents
|
||||
|
||||
[](https://jitpack.io/#retrooper/packetevents)
|
||||
[](https://github.com/retrooper/packetevents/blob/2.0/LICENSE) [](https://github.com/retrooper/packetevents/actions) [](https://discord.gg/prqzNg9tRU)
|
||||
|
||||
PacketEvents is a fast and efficient multi-platform packet processing library. Our packet wrappers are easy to use with multi-version support. With our API you can write code that runs on Spigot, BungeeCord, Velocity, and Fabric! Switch to PacketEvents today by joining \
|
||||
our [Discord Server](https://discord.me/packetevents) for help.
|
||||
|
||||
### Links
|
||||
* [Find release builds on SpigotMC](https://www.spigotmc.org/resources/packetevents-api.80279/)
|
||||
* [Find release builds on Modrinth](https://modrinth.com/plugin/packetevents)
|
||||
* [Find development builds on Jenkins](https://ci.codemc.io/job/retrooper/job/packetevents)
|
||||
* [View documentation on our JavaDocs Page](https://packetevents.github.io/javadocs)
|
||||
|
||||
### Setup
|
||||
[Learn more](https://github.com/retrooper/packetevents/wiki/Setup-2.0)
|
||||
[How to Setup PacketEvents](https://github.com/retrooper/packetevents/wiki/Depending-on-pre%E2%80%90built-PacketEvents)
|
||||
|
||||
### Sponsorships
|
||||
[](https://www.ej-technologies.com/products/jprofiler/overview.html)
|
||||
@@ -18,15 +20,6 @@ our [Discord Server](https://discord.me/packetevents) for help.
|
||||
PacketEvents optionally collects statistics using [bStats](https://bstats.org/)\
|
||||
Check out our [bStats page](https://bstats.org/plugin/bukkit/packetevents/11327)
|
||||
|
||||
This library is licensed under the GPLv3 (General Public License version 3). Here are a few sources to learn more about the license.\
|
||||
[](https://github.com/retrooper/packetevents/blob/2.0/LICENSE)
|
||||
### GPL Resources
|
||||
* https://www.gnu.org/philosophy/free-sw.html
|
||||
* https://www.gnu.org/philosophy/free-sw.html#clarifying
|
||||
* https://www.gnu.org/licenses/copyleft.en.html
|
||||
* https://www.gnu.org/licenses/quick-guide-gplv3.html
|
||||
* https://gpl-violations.org/faq/sourcecode-faq/
|
||||
|
||||
### Credit to these projects
|
||||
[wiki.vg/Protocol](https://wiki.vg/Protocol)\
|
||||
[netty](https://github.com/netty/netty)\
|
||||
|
||||
@@ -38,7 +38,7 @@ public abstract class PacketEventsAPI<T> {
|
||||
private final Logger LOGGER = Logger.getLogger(PacketEventsAPI.class.getName());
|
||||
private static final LogManager LOG_MANAGER = new LogManager();
|
||||
//TODO UPDATE
|
||||
private static final PEVersion VERSION = new PEVersion(2, 0, 0);
|
||||
private static final PEVersion VERSION = new PEVersion(2, 0, 2);
|
||||
|
||||
public EventManager getEventManager() {
|
||||
return EVENT_MANAGER;
|
||||
|
||||
@@ -166,7 +166,6 @@ public abstract class ProtocolPacketEvent<T> extends PacketEvent implements Play
|
||||
this.byteBuf = byteBuf;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public int getPacketId() {
|
||||
return packetID;
|
||||
}
|
||||
|
||||
@@ -32,4 +32,6 @@ public interface ChannelInjector {
|
||||
void updateUser(Object channel, User user);
|
||||
|
||||
void setPlayer(Object channel, Object player);
|
||||
|
||||
boolean isProxy();
|
||||
}
|
||||
+12
-6
@@ -92,9 +92,12 @@ public class InternalPacketListener extends PacketListenerAbstract {
|
||||
user.setWorldNBT(list);
|
||||
|
||||
// Update world height
|
||||
NBTCompound worldNBT = user.getWorldNBT(joinGame.getDimension().getDimensionName()).getCompoundTagOrNull("element");
|
||||
user.setMinWorldHeight(worldNBT.getNumberTagOrNull("min_y").getAsInt());
|
||||
user.setTotalWorldHeight(worldNBT.getNumberTagOrNull("height").getAsInt());
|
||||
NBTCompound dimension = user.getWorldNBT(joinGame.getDimension().getDimensionName());
|
||||
if (dimension != null) {
|
||||
NBTCompound worldNBT = dimension.getCompoundTagOrNull("element");
|
||||
user.setMinWorldHeight(worldNBT.getNumberTagOrNull("min_y").getAsInt());
|
||||
user.setTotalWorldHeight(worldNBT.getNumberTagOrNull("height").getAsInt());
|
||||
}
|
||||
}
|
||||
|
||||
// Respawn is used to switch dimensions
|
||||
@@ -105,9 +108,12 @@ public class InternalPacketListener extends PacketListenerAbstract {
|
||||
return; // Fixed world height, no tags are sent to the client
|
||||
}
|
||||
|
||||
NBTCompound worldNBT = user.getWorldNBT(respawn.getDimension().getDimensionName()).getCompoundTagOrNull("element"); // This is 1.17+, it always sends the world name
|
||||
user.setMinWorldHeight(worldNBT.getNumberTagOrNull("min_y").getAsInt());
|
||||
user.setTotalWorldHeight(worldNBT.getNumberTagOrNull("height").getAsInt());
|
||||
NBTCompound dimension = user.getWorldNBT(respawn.getDimension().getDimensionName());
|
||||
if (dimension != null) {
|
||||
NBTCompound worldNBT = dimension.getCompoundTagOrNull("element"); // This is 1.17+, it always sends the world name
|
||||
user.setMinWorldHeight(worldNBT.getNumberTagOrNull("min_y").getAsInt());
|
||||
user.setTotalWorldHeight(worldNBT.getNumberTagOrNull("height").getAsInt());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-8
@@ -25,6 +25,7 @@ import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.protocol.player.User;
|
||||
import com.github.retrooper.packetevents.util.PacketTransformationUtil;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
@@ -96,13 +97,14 @@ public interface ProtocolManager {
|
||||
getUser(channel).setClientVersion(version);
|
||||
}
|
||||
|
||||
default Object[] transformWrappers(PacketWrapper<?> wrapper, Object channel) {
|
||||
@ApiStatus.Internal
|
||||
default Object[] transformWrappers(PacketWrapper<?> wrapper, Object channel, boolean outgoing) {
|
||||
//It is possible that our packet transformer util decides to transform one wrapper into multiple packets.
|
||||
//(Correcting some mistakes on your end)
|
||||
PacketWrapper<?>[] wrappers = PacketTransformationUtil.transform(wrapper);
|
||||
Object[] buffers = new Object[wrappers.length];
|
||||
for (int i = 0; i < wrappers.length; i++) {
|
||||
wrappers[i].prepareForSend(channel);
|
||||
wrappers[i].prepareForSend(channel, outgoing);
|
||||
buffers[i] = wrappers[i].buffer;
|
||||
// Fix race condition when sending packets to multiple people (due to when the buffer is freed)
|
||||
wrappers[i].buffer = null;
|
||||
@@ -111,32 +113,32 @@ public interface ProtocolManager {
|
||||
}
|
||||
|
||||
default void sendPacket(Object channel, PacketWrapper<?> wrapper) {
|
||||
Object[] transformed = transformWrappers(wrapper, channel);
|
||||
Object[] transformed = transformWrappers(wrapper, channel, true);
|
||||
sendPackets(channel, transformed);
|
||||
}
|
||||
|
||||
default void sendPacketSilently(Object channel, PacketWrapper<?> wrapper) {
|
||||
Object[] transformed = transformWrappers(wrapper, channel);
|
||||
Object[] transformed = transformWrappers(wrapper, channel, true);
|
||||
sendPacketsSilently(channel, transformed);
|
||||
}
|
||||
|
||||
default void writePacket(Object channel, PacketWrapper<?> wrapper) {
|
||||
Object[] transformed = transformWrappers(wrapper, channel);
|
||||
Object[] transformed = transformWrappers(wrapper, channel, true);
|
||||
writePackets(channel, transformed);
|
||||
}
|
||||
|
||||
default void writePacketSilently(Object channel, PacketWrapper<?> wrapper) {
|
||||
Object[] transformed = transformWrappers(wrapper, channel);
|
||||
Object[] transformed = transformWrappers(wrapper, channel, true);
|
||||
writePacketsSilently(channel, transformed);
|
||||
}
|
||||
|
||||
default void receivePacket(Object channel, PacketWrapper<?> wrapper) {
|
||||
Object[] transformed = transformWrappers(wrapper, channel);
|
||||
Object[] transformed = transformWrappers(wrapper, channel, false);
|
||||
receivePackets(channel, transformed);
|
||||
}
|
||||
|
||||
default void receivePacketSilently(Object channel, PacketWrapper<?> wrapper) {
|
||||
Object[] transformed = transformWrappers(wrapper, channel);
|
||||
Object[] transformed = transformWrappers(wrapper, channel, false);
|
||||
receivePacketsSilently(channel, transformed);
|
||||
}
|
||||
|
||||
|
||||
+41
@@ -142,6 +142,11 @@ public final class PacketType {
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.CLIENT;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Server implements PacketTypeConstant, ClientBoundPacket {
|
||||
@@ -161,6 +166,11 @@ public final class PacketType {
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.SERVER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -189,6 +199,12 @@ public final class PacketType {
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.CLIENT;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Server implements PacketTypeConstant, ClientBoundPacket {
|
||||
@@ -215,6 +231,11 @@ public final class PacketType {
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.SERVER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,6 +268,11 @@ public final class PacketType {
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.CLIENT;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Server implements PacketTypeConstant, ClientBoundPacket {
|
||||
@@ -285,6 +311,11 @@ public final class PacketType {
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.SERVER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,6 +441,11 @@ public final class PacketType {
|
||||
int index = SERVERBOUND_PLAY_VERSION_MAPPER.getIndex(version);
|
||||
return ids[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.CLIENT;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Server implements PacketTypeCommon, ClientBoundPacket {
|
||||
@@ -582,6 +618,11 @@ public final class PacketType {
|
||||
return map.get(packetId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketSide getSide() {
|
||||
return PacketSide.SERVER;
|
||||
}
|
||||
|
||||
private static void loadPacketIds(Enum<?>[] enumConstants) {
|
||||
int index = INDEX;
|
||||
for (Enum<?> constant : enumConstants) {
|
||||
|
||||
+3
@@ -18,6 +18,7 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.packettype;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.PacketSide;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
|
||||
public interface PacketTypeCommon {
|
||||
@@ -27,4 +28,6 @@ public interface PacketTypeCommon {
|
||||
}
|
||||
|
||||
int getId(ClientVersion version);
|
||||
|
||||
PacketSide getSide();
|
||||
}
|
||||
@@ -150,7 +150,8 @@ public class User {
|
||||
}
|
||||
|
||||
public void sendMessage(Component component, ChatType type) {
|
||||
ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion();
|
||||
ServerVersion version = PacketEvents.getAPI().getInjector().isProxy() ? getClientVersion().toServerVersion() :
|
||||
PacketEvents.getAPI().getServerManager().getVersion();
|
||||
PacketWrapper<?> chatPacket;
|
||||
if (version.isNewerThanOrEquals(ServerVersion.V_1_19)) {
|
||||
chatPacket = new WrapperPlayServerSystemChatMessage(false, component);
|
||||
@@ -174,7 +175,9 @@ public class User {
|
||||
}
|
||||
|
||||
public void sendTitle(Component title, Component subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) {
|
||||
boolean modern = PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_17);
|
||||
ServerVersion version = PacketEvents.getAPI().getInjector().isProxy() ? getClientVersion().toServerVersion() :
|
||||
PacketEvents.getAPI().getServerManager().getVersion();
|
||||
boolean modern = version.isNewerThanOrEquals(ServerVersion.V_1_17);
|
||||
PacketWrapper<?> animation;
|
||||
PacketWrapper<?> setTitle = null;
|
||||
PacketWrapper<?> setSubtitle = null;
|
||||
@@ -242,6 +245,9 @@ public class User {
|
||||
|
||||
@Nullable
|
||||
public NBTCompound getWorldNBT(String worldName) {
|
||||
if (worldNBT == null) {
|
||||
return null;
|
||||
}
|
||||
for (NBTCompound compound : worldNBT) {
|
||||
if (compound.getStringTagOrNull("name").getValue().equals(worldName)) {
|
||||
return compound;
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ public class UpdateChecker {
|
||||
+ ColorUtil.toString(NamedTextColor.YELLOW) + localVersion
|
||||
+ ColorUtil.toString(NamedTextColor.WHITE) + ") | Latest released build: ("
|
||||
+ ColorUtil.toString(NamedTextColor.GREEN) + newVersion
|
||||
+ ColorUtil.toString(NamedTextColor.RED) + ")");
|
||||
+ ColorUtil.toString(NamedTextColor.WHITE) + ")");
|
||||
return UpdateCheckerStatus.OUTDATED;
|
||||
} else if (newVersion != null && localVersion.isNewerThan(newVersion)) {
|
||||
PacketEvents.getAPI().getLogManager().info("You are on a dev or pre released build of packetevents. Your build: ("
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2023 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.wrapper;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class PacketTypeData {
|
||||
private @Nullable PacketTypeCommon packetType;
|
||||
private int nativePacketId;
|
||||
|
||||
public PacketTypeData(@Nullable PacketTypeCommon packetType, int nativePacketId) {
|
||||
this.packetType = packetType;
|
||||
this.nativePacketId = nativePacketId;
|
||||
}
|
||||
|
||||
public @Nullable PacketTypeCommon getPacketType() {
|
||||
return packetType;
|
||||
}
|
||||
|
||||
public int getNativePacketId() {
|
||||
return nativePacketId;
|
||||
}
|
||||
|
||||
public void setPacketType(@Nullable PacketTypeCommon packetType) {
|
||||
this.packetType = packetType;
|
||||
}
|
||||
|
||||
public void setNativePacketId(int nativePacketId) {
|
||||
this.nativePacketId = nativePacketId;
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.manager.server.VersionComparison;
|
||||
import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper;
|
||||
import com.github.retrooper.packetevents.netty.channel.ChannelHelper;
|
||||
import com.github.retrooper.packetevents.protocol.PacketSide;
|
||||
import com.github.retrooper.packetevents.protocol.chat.*;
|
||||
import com.github.retrooper.packetevents.protocol.chat.filter.FilterMask;
|
||||
import com.github.retrooper.packetevents.protocol.chat.filter.FilterMaskType;
|
||||
@@ -39,6 +40,7 @@ import com.github.retrooper.packetevents.protocol.item.type.ItemType;
|
||||
import com.github.retrooper.packetevents.protocol.item.type.ItemTypes;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.codec.NBTCodec;
|
||||
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
|
||||
import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.protocol.player.GameMode;
|
||||
@@ -55,6 +57,7 @@ import com.github.retrooper.packetevents.util.crypto.MinecraftEncryptionUtil;
|
||||
import com.github.retrooper.packetevents.util.crypto.SaltSignature;
|
||||
import com.github.retrooper.packetevents.util.crypto.SignatureData;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.ApiStatus.Experimental;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -73,7 +76,7 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
|
||||
protected ClientVersion clientVersion;
|
||||
protected ServerVersion serverVersion;
|
||||
private int packetID;
|
||||
private PacketTypeData packetTypeData;
|
||||
// For sending chunk data packets, which need this data
|
||||
@Nullable
|
||||
protected User user;
|
||||
@@ -88,7 +91,7 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
this.clientVersion = clientVersion;
|
||||
this.serverVersion = serverVersion;
|
||||
this.buffer = null;
|
||||
this.packetID = packetID;
|
||||
this.packetTypeData = new PacketTypeData(null, packetID);
|
||||
}
|
||||
|
||||
public PacketWrapper(PacketReceiveEvent event) {
|
||||
@@ -100,7 +103,7 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
this.serverVersion = event.getServerVersion();
|
||||
this.user = event.getUser();
|
||||
this.buffer = event.getByteBuf();
|
||||
this.packetID = event.getPacketId();
|
||||
this.packetTypeData = new PacketTypeData(event.getPacketType(), event.getPacketId());
|
||||
if (readData) {
|
||||
readEvent(event);
|
||||
}
|
||||
@@ -114,7 +117,7 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
this.clientVersion = event.getUser().getClientVersion();
|
||||
this.serverVersion = event.getServerVersion();
|
||||
this.buffer = event.getByteBuf();
|
||||
this.packetID = event.getPacketId();
|
||||
this.packetTypeData = new PacketTypeData(event.getPacketType(), event.getPacketId());
|
||||
this.user = event.getUser();
|
||||
if (readData) {
|
||||
readEvent(event);
|
||||
@@ -126,13 +129,21 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
}
|
||||
|
||||
public PacketWrapper(int packetID) {
|
||||
this(ClientVersion.UNKNOWN,
|
||||
PacketEvents.getAPI().getServerManager().getVersion(),
|
||||
packetID);
|
||||
if (packetID == -1) {
|
||||
throw new IllegalArgumentException("Packet does not exist on this protocol version!");
|
||||
}
|
||||
this.clientVersion = ClientVersion.UNKNOWN;
|
||||
this.serverVersion = PacketEvents.getAPI().getServerManager().getVersion();
|
||||
this.buffer = null;
|
||||
this.packetTypeData = new PacketTypeData(null, packetID);
|
||||
}
|
||||
|
||||
public PacketWrapper(PacketTypeCommon packetType) {
|
||||
this(packetType.getId(PacketEvents.getAPI().getServerManager().getVersion().toClientVersion()));
|
||||
this.clientVersion = ClientVersion.UNKNOWN;
|
||||
this.serverVersion = PacketEvents.getAPI().getServerManager().getVersion();
|
||||
this.buffer = null;
|
||||
int id = packetType.getId(PacketEvents.getAPI().getServerManager().getVersion().toClientVersion());
|
||||
this.packetTypeData = new PacketTypeData(packetType, id);
|
||||
}
|
||||
|
||||
public static PacketWrapper<?> createUniversalPacketWrapper(Object byteBuf) {
|
||||
@@ -141,14 +152,30 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
public final void prepareForSend(Object channel) {
|
||||
@ApiStatus.Internal
|
||||
public final void prepareForSend(Object channel, boolean outgoing) {
|
||||
// Null means the packet was manually created and wasn't sent by the server itself
|
||||
// A reference count of 0 means that the packet was freed (it was already sent)
|
||||
if (buffer == null || ByteBufHelper.refCnt(buffer) == 0) {
|
||||
buffer = ChannelHelper.pooledByteBuf(channel);
|
||||
}
|
||||
|
||||
writeVarInt(packetID);
|
||||
//On proxies, we must rewrite the packet ID in a format compatible for the targeted client version
|
||||
if (PacketEvents.getAPI().getInjector().isProxy()) {
|
||||
User user = PacketEvents.getAPI().getProtocolManager().getUser(channel);
|
||||
if (packetTypeData.getPacketType() == null) {
|
||||
//Get the packet type with the local version packet type mappings.
|
||||
packetTypeData.setPacketType(PacketType.getById(outgoing ? PacketSide.SERVER : PacketSide.CLIENT,
|
||||
user.getConnectionState(), serverVersion.toClientVersion(), packetTypeData.getNativePacketId()));
|
||||
}
|
||||
//Change local version to user version so that the packet can be processed correctly.
|
||||
serverVersion = user.getClientVersion().toServerVersion();
|
||||
int id = packetTypeData.getPacketType().getId(user.getClientVersion());
|
||||
writeVarInt(id);
|
||||
}
|
||||
else {
|
||||
writeVarInt(packetTypeData.getNativePacketId());
|
||||
}
|
||||
write();
|
||||
}
|
||||
|
||||
@@ -197,21 +224,50 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the Packet ID for the current platform version
|
||||
* @deprecated Use {@link #getNativePacketId()}
|
||||
* @return Packet ID
|
||||
*/
|
||||
@Deprecated
|
||||
public int getPacketId() {
|
||||
return packetID;
|
||||
return getNativePacketId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Packet ID for the current platform version
|
||||
* @deprecated Use {@link #setNativePacketId(int)}
|
||||
*/
|
||||
@Deprecated
|
||||
public void setPacketId(int packetID) {
|
||||
this.packetID = packetID;
|
||||
setNativePacketId(packetID);
|
||||
}
|
||||
|
||||
public int getNativePacketId() {
|
||||
return packetTypeData.getNativePacketId();
|
||||
}
|
||||
|
||||
public void setNativePacketId(int nativePacketId) {
|
||||
this.packetTypeData.setNativePacketId(nativePacketId);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public PacketTypeData getPacketTypeData() {
|
||||
return packetTypeData;
|
||||
}
|
||||
|
||||
public int getMaxMessageLength() {
|
||||
return serverVersion.isNewerThanOrEquals(ServerVersion.V_1_13) ? MODERN_MESSAGE_LENGTH : LEGACY_MESSAGE_LENGTH;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void resetByteBuf() {
|
||||
ByteBufHelper.clear(buffer);
|
||||
writeVarInt(packetID);
|
||||
}
|
||||
|
||||
public void resetBuffer() {
|
||||
ByteBufHelper.clear(buffer);
|
||||
}
|
||||
|
||||
public byte readByte() {
|
||||
@@ -342,14 +398,11 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
writeNBT(itemStack.getNBT());
|
||||
}
|
||||
} else {
|
||||
int typeID;
|
||||
if (itemStack.isEmpty()) {
|
||||
typeID = -1;
|
||||
writeShort(-1);
|
||||
} else {
|
||||
typeID = itemStack.getType().getId(serverVersion.toClientVersion());
|
||||
}
|
||||
writeShort(typeID);
|
||||
if (typeID >= 0) {
|
||||
int typeID = itemStack.getType().getId(serverVersion.toClientVersion());
|
||||
writeShort(typeID);
|
||||
writeByte(itemStack.getAmount());
|
||||
writeShort(itemStack.getLegacyData());
|
||||
writeNBT(itemStack.getNBT());
|
||||
@@ -668,9 +721,9 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
list.add(new EntityData(index, type, value));
|
||||
}
|
||||
} else {
|
||||
for (byte data = readByte(); data != 127; data = readByte()) {
|
||||
int typeID = (data & 224) >> 5;
|
||||
int index = data & 31;
|
||||
for (byte data = readByte(); data != Byte.MAX_VALUE; data = readByte()) {
|
||||
int typeID = (data & 0xE0) >> 5;
|
||||
int index = data & 0x1F;
|
||||
EntityDataType<?> type = EntityDataTypes.getById(serverVersion.toClientVersion(), typeID);
|
||||
Object value = type.getDataDeserializer().apply(this);
|
||||
EntityData entityData = new EntityData(index, type, value);
|
||||
@@ -736,12 +789,10 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
//Read optional signature
|
||||
if (readBoolean()) {
|
||||
signature = readBytes(256);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
signature = new byte[0];
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
signature = readByteArray(256);
|
||||
}
|
||||
return new SaltSignature(salt, signature);
|
||||
@@ -756,8 +807,7 @@ public class PacketWrapper<T extends PacketWrapper> {
|
||||
writeBytes(signature.getSignature());
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
writeByteArray(signature.getSignature());
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -59,14 +59,14 @@ public class WrapperPlayServerChunkData extends PacketWrapper<WrapperPlayServerC
|
||||
// 1.18 only (lighting) - for writing data
|
||||
// TODO: Make accessible?? Include in chunk data?? What do we do with this?
|
||||
private boolean trustEdges;
|
||||
private BitSet blockLightMask = new BitSet();
|
||||
private BitSet skyLightMask = new BitSet();
|
||||
private BitSet emptyBlockLightMask = new BitSet();
|
||||
private BitSet emptySkyLightMask = new BitSet();
|
||||
private BitSet blockLightMask;
|
||||
private BitSet skyLightMask;
|
||||
private BitSet emptyBlockLightMask;
|
||||
private BitSet emptySkyLightMask;
|
||||
private int skyLightCount;
|
||||
private int blockLightCount;
|
||||
private byte[][] skyLightArray = new byte[0][0];
|
||||
private byte[][] blockLightArray = new byte[0][0];
|
||||
private byte[][] skyLightArray;
|
||||
private byte[][] blockLightArray;
|
||||
|
||||
public WrapperPlayServerChunkData(PacketSendEvent event) {
|
||||
super(event);
|
||||
|
||||
+29
-6
@@ -2,30 +2,53 @@ package com.github.retrooper.packetevents.wrapper.play.server;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import com.github.retrooper.packetevents.event.PacketSendEvent;
|
||||
|
||||
public class WrapperPlayServerHurtAnimation extends PacketWrapper<WrapperPlayServerHurtAnimation> {
|
||||
int entityId;
|
||||
float hurtDir;
|
||||
private int entityId;
|
||||
private float yaw;
|
||||
|
||||
public WrapperPlayServerHurtAnimation() {
|
||||
public WrapperPlayServerHurtAnimation(PacketSendEvent event) {
|
||||
super(event);
|
||||
}
|
||||
|
||||
public WrapperPlayServerHurtAnimation(int entityId, float yaw) {
|
||||
super(PacketType.Play.Server.HURT_ANIMATION);
|
||||
this.entityId = entityId;
|
||||
this.yaw = yaw;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read() {
|
||||
entityId = readVarInt();
|
||||
hurtDir = readFloat();
|
||||
yaw = readFloat();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write() {
|
||||
writeVarInt(entityId);
|
||||
writeFloat(hurtDir);
|
||||
writeFloat(yaw);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copy(WrapperPlayServerHurtAnimation wrapper) {
|
||||
this.entityId = wrapper.entityId;
|
||||
this.hurtDir = wrapper.hurtDir;
|
||||
this.yaw = wrapper.yaw;
|
||||
}
|
||||
|
||||
public int getEntityId() {
|
||||
return entityId;
|
||||
}
|
||||
|
||||
public void setEntityId(int entityId) {
|
||||
this.entityId = entityId;
|
||||
}
|
||||
|
||||
public float getYaw() {
|
||||
return yaw;
|
||||
}
|
||||
|
||||
public void setYaw(float yaw) {
|
||||
this.yaw = yaw;
|
||||
}
|
||||
}
|
||||
+5
-5
@@ -27,6 +27,8 @@ import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class WrapperPlayServerTitle extends PacketWrapper<WrapperPlayServerTitle> {
|
||||
public static boolean HANDLE_JSON = true;
|
||||
private TitleAction action;
|
||||
@@ -77,15 +79,14 @@ public class WrapperPlayServerTitle extends PacketWrapper<WrapperPlayServerTitle
|
||||
|
||||
@Override
|
||||
public void read() {
|
||||
boolean modern = PacketEvents.getAPI().getServerManager()
|
||||
.getVersion().isNewerThanOrEquals(ServerVersion.V_1_11);
|
||||
boolean modern = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_11);
|
||||
int id = readVarInt();
|
||||
if (modern) {
|
||||
action = TitleAction.fromId(id);
|
||||
} else {
|
||||
action = TitleAction.fromLegacyId(id);
|
||||
}
|
||||
switch (action) {
|
||||
switch (Objects.requireNonNull(action)) {
|
||||
case SET_TITLE:
|
||||
titleJson = readComponentJSON();
|
||||
if (HANDLE_JSON) {
|
||||
@@ -128,8 +129,7 @@ public class WrapperPlayServerTitle extends PacketWrapper<WrapperPlayServerTitle
|
||||
|
||||
@Override
|
||||
public void write() {
|
||||
boolean modern = PacketEvents.getAPI().getServerManager()
|
||||
.getVersion().isNewerThanOrEquals(ServerVersion.V_1_11);
|
||||
boolean modern = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_11);
|
||||
int id = modern ? action.getId() : action.getLegacyId();
|
||||
writeVarInt(id);
|
||||
switch (action) {
|
||||
|
||||
+2
-2
@@ -47,7 +47,7 @@ public class WrapperPlayServerUseBed extends PacketWrapper<WrapperPlayServerUseB
|
||||
|
||||
@Override
|
||||
public void read() {
|
||||
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_8)) {
|
||||
if (serverVersion.isNewerThanOrEquals(ServerVersion.V_1_8)) {
|
||||
entityId = readVarInt();
|
||||
position = readBlockPosition();
|
||||
} else {
|
||||
@@ -61,7 +61,7 @@ public class WrapperPlayServerUseBed extends PacketWrapper<WrapperPlayServerUseB
|
||||
|
||||
@Override
|
||||
public void write() {
|
||||
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_8)) {
|
||||
if (serverVersion.isNewerThanOrEquals(ServerVersion.V_1_8)) {
|
||||
writeVarInt(entityId);
|
||||
writeBlockPosition(position);
|
||||
} else {
|
||||
|
||||
@@ -12290,6 +12290,7 @@
|
||||
"stone_pressure_plate": "70",
|
||||
"oak_pressure_plate": "72",
|
||||
"redstone_ore": "73",
|
||||
"redstone_torch": "76",
|
||||
"stone_button": "77",
|
||||
"snow": "78",
|
||||
"ice": "79",
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ subprojects {
|
||||
|
||||
group = 'com.github.retrooper'
|
||||
description = project.name
|
||||
version = '2.0.0'//TODO UPDATE - ADD "-SNAPSHOT" if we are dealing with snapshot versions
|
||||
version = '2.0.2'//TODO UPDATE - ADD "-SNAPSHOT" if we are dealing with snapshot versions
|
||||
|
||||
project.ext.nettyVersion = '4.1.72.Final'
|
||||
project.ext.adventureVersion = '4.14.0'
|
||||
|
||||
@@ -20,8 +20,15 @@ package io.github.retrooper.packetevents;
|
||||
|
||||
import com.github.retrooper.packetevents.PacketEvents;
|
||||
import com.github.retrooper.packetevents.event.*;
|
||||
import com.github.retrooper.packetevents.protocol.chat.ChatTypes;
|
||||
import com.github.retrooper.packetevents.protocol.chat.message.ChatMessageLegacy;
|
||||
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
|
||||
import com.github.retrooper.packetevents.util.TimeStampMode;
|
||||
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
|
||||
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerChatMessage;
|
||||
import io.github.retrooper.packetevents.bungee.factory.BungeePacketEventsBuilder;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.md_5.bungee.api.plugin.Plugin;
|
||||
|
||||
public final class PacketEventsPlugin extends Plugin {
|
||||
@@ -34,13 +41,23 @@ public final class PacketEventsPlugin extends Plugin {
|
||||
@Override
|
||||
public void onEnable() {
|
||||
// Register your listeners
|
||||
PacketEvents.getAPI().getSettings().debug(true).bStats(true).checkForUpdates(true).timeStampMode(TimeStampMode.MILLIS).reEncodeByDefault(false);
|
||||
PacketEvents.getAPI().getSettings().debug(true).bStats(true).checkForUpdates(true).timeStampMode(TimeStampMode.MILLIS).reEncodeByDefault(true);
|
||||
PacketEvents.getAPI().init();
|
||||
PacketListenerCommon listener = new PacketListenerAbstract(PacketListenerPriority.HIGH) {
|
||||
@Override
|
||||
public void onPacketReceive(PacketReceiveEvent event) {
|
||||
//System.out.println("Pipe: " + ChannelHelper.pipelineHandlerNamesAsString(event.getChannel()));
|
||||
//System.out.println("In type: " + event.getPacketType().getName());
|
||||
|
||||
//Testing sending packets to users on proxies!
|
||||
/*if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
|
||||
if (new WrapperPlayClientInteractEntity(event).getAction() == WrapperPlayClientInteractEntity.InteractAction.ATTACK) {
|
||||
event.getUser().sendMessage(Component.text("Test message").color(NamedTextColor.RED));
|
||||
event.getUser().sendTitle(Component.text("Test title").color(NamedTextColor.GREEN),
|
||||
Component.text("subtitle test").color(NamedTextColor.RED),
|
||||
3, 3, 5);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -49,7 +66,7 @@ public final class PacketEventsPlugin extends Plugin {
|
||||
//System.out.println("Out type: " + event.getPacketType().getName());
|
||||
}
|
||||
};
|
||||
PacketEvents.getAPI().getEventManager().registerListener(listener);
|
||||
//PacketEvents.getAPI().getEventManager().registerListener(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+3
-1
@@ -56,7 +56,9 @@ public class PacketEventsDecoder extends MessageToMessageDecoder<ByteBuf> {
|
||||
packetReceiveEvent.getLastUsedWrapper().writeVarInt(packetReceiveEvent.getPacketId());
|
||||
packetReceiveEvent.getLastUsedWrapper().write();
|
||||
}
|
||||
transformed.readerIndex(firstReaderIndex);
|
||||
else {
|
||||
transformed.readerIndex(firstReaderIndex);
|
||||
}
|
||||
output.add(transformed.retain());
|
||||
}
|
||||
if (packetReceiveEvent.hasPostTasks()) {
|
||||
|
||||
+4
-3
@@ -21,7 +21,6 @@ package io.github.retrooper.packetevents.handlers;
|
||||
import com.github.retrooper.packetevents.PacketEvents;
|
||||
import com.github.retrooper.packetevents.event.PacketSendEvent;
|
||||
import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper;
|
||||
import com.github.retrooper.packetevents.netty.channel.ChannelHelper;
|
||||
import com.github.retrooper.packetevents.protocol.player.User;
|
||||
import com.github.retrooper.packetevents.util.EventCreationUtil;
|
||||
import io.github.retrooper.packetevents.injector.CustomPipelineUtil;
|
||||
@@ -58,7 +57,9 @@ public class PacketEventsEncoder extends MessageToByteEncoder<ByteBuf> {
|
||||
packetSendEvent.getLastUsedWrapper().writeVarInt(packetSendEvent.getPacketId());
|
||||
packetSendEvent.getLastUsedWrapper().write();
|
||||
}
|
||||
buffer.readerIndex(firstReaderIndex);
|
||||
else {
|
||||
buffer.readerIndex(firstReaderIndex);
|
||||
}
|
||||
if (doCompression) {
|
||||
recompress(ctx, buffer);
|
||||
}
|
||||
@@ -110,7 +111,7 @@ public class PacketEventsEncoder extends MessageToByteEncoder<ByteBuf> {
|
||||
PacketEventsEncoder encoder = (PacketEventsEncoder) pipe.remove(PacketEvents.ENCODER_NAME);
|
||||
pipe.addAfter("decompress", PacketEvents.DECODER_NAME, decoder);
|
||||
pipe.addAfter("compress", PacketEvents.ENCODER_NAME, encoder);
|
||||
System.out.println("Pipe: " + ChannelHelper.pipelineHandlerNamesAsString(ctx.channel()));
|
||||
//System.out.println("Pipe: " + ChannelHelper.pipelineHandlerNamesAsString(ctx.channel()));
|
||||
handledCompression = true;
|
||||
return true;
|
||||
} catch (InvocationTargetException e) {
|
||||
|
||||
+5
@@ -126,4 +126,9 @@ public class BungeePipelineInjector implements ChannelInjector {
|
||||
PacketEventsEncoder encoder = (PacketEventsEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME);
|
||||
encoder.user = user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isProxy() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+5
@@ -227,4 +227,9 @@ public class SpigotChannelInjector implements ChannelInjector {
|
||||
private PacketEventsDecoder getDecoder(Channel channel) {
|
||||
return (PacketEventsDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isProxy() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,8 @@ import com.github.retrooper.packetevents.PacketEvents;
|
||||
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import com.github.retrooper.packetevents.event.PacketReceiveEvent;
|
||||
import com.github.retrooper.packetevents.event.PacketSendEvent;
|
||||
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
|
||||
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
|
||||
import com.google.inject.Inject;
|
||||
import com.velocitypowered.api.event.PostOrder;
|
||||
import com.velocitypowered.api.event.Subscribe;
|
||||
@@ -31,6 +33,8 @@ import com.velocitypowered.api.plugin.Plugin;
|
||||
import com.velocitypowered.api.plugin.PluginContainer;
|
||||
import com.velocitypowered.api.proxy.ProxyServer;
|
||||
import io.github.retrooper.packetevents.velocity.factory.VelocityPacketEventsBuilder;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@@ -56,6 +60,16 @@ public class PacketEventsPlugin {
|
||||
@Override
|
||||
public void onPacketReceive(PacketReceiveEvent event) {
|
||||
//System.out.println("Incoming: " + event.getPacketType().getName());
|
||||
|
||||
//Testing sending packets to users on proxies!
|
||||
/*if (event.getPacketType() == PacketType.Play.Client.INTERACT_ENTITY) {
|
||||
if (new WrapperPlayClientInteractEntity(event).getAction() == WrapperPlayClientInteractEntity.InteractAction.ATTACK) {
|
||||
event.getUser().sendMessage(Component.text("Test message").color(NamedTextColor.RED));
|
||||
event.getUser().sendTitle(Component.text("Test title").color(NamedTextColor.GREEN),
|
||||
Component.text("subtitle test").color(NamedTextColor.RED),
|
||||
3, 3, 5);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-2
@@ -89,13 +89,12 @@ public class PacketEventsDecoder extends MessageToMessageDecoder<ByteBuf> {
|
||||
}
|
||||
//We can use == as it is an enum constant
|
||||
if (event == VELOCITY_CONNECTION_EVENT_CONSTANT && !handledCompression) {
|
||||
System.out.println("constant: " + VELOCITY_CONNECTION_EVENT_CONSTANT.name());
|
||||
ChannelPipeline pipe = ctx.pipeline();
|
||||
PacketEventsEncoder encoder = (PacketEventsEncoder) pipe.remove(PacketEvents.ENCODER_NAME);
|
||||
pipe.addBefore("minecraft-encoder", PacketEvents.ENCODER_NAME, encoder);
|
||||
PacketEventsDecoder decoder = (PacketEventsDecoder) pipe.remove(PacketEvents.DECODER_NAME);
|
||||
pipe.addBefore("minecraft-decoder", PacketEvents.DECODER_NAME, decoder);
|
||||
System.out.println("Pipe: " + ChannelHelper.pipelineHandlerNamesAsString(ctx.channel()));
|
||||
//System.out.println("Pipe: " + ChannelHelper.pipelineHandlerNamesAsString(ctx.channel()));
|
||||
handledCompression = true;
|
||||
}
|
||||
super.userEventTriggered(ctx, event);
|
||||
|
||||
+5
@@ -103,4 +103,9 @@ public class VelocityPipelineInjector implements ChannelInjector {
|
||||
PacketEventsEncoder encoder = (PacketEventsEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME);
|
||||
encoder.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isProxy() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user