Compare commits

...
12 Commits
Author SHA1 Message Date
retrooper cdc7ed36e0 PacketEvents 2.0.2 update 2023-09-13 16:01:41 +02:00
retrooper 5d63308a22 Delete WrapperPlayServerChunkData default values 2023-09-13 15:36:20 +02:00
retrooper 214706dbb6 Fix update checker colors 2023-09-12 00:59:18 +02:00
retrooper fa3b563c70 2.0.1 release 2023-09-12 00:36:31 +02:00
retrooper 55e31483e7 Changes to naming of WrapperPlayServerHurtAnimation 2023-09-12 00:02:38 +02:00
retrooper aa34910468 Update User#getWorldNBT usages to handle a nullable value. 2023-09-11 23:35:11 +02:00
retrooper 5e44913a5e Sending packets on proxies is now supported!
* ChannelInjector#isProxy added to detect if our implementation is running on a proxy
2023-08-31 20:25:27 +02:00
retrooper b8dc964112 Add jenkins builds on README 2023-08-31 10:40:57 +02:00
retrooper 890844fb60 Fix broken link in README 2023-08-31 10:40:08 +02:00
retrooper fc57c9e077 Update README 2023-08-31 09:46:32 +02:00
retrooper f12ef113aa Fixed packet-modification on BungeeCord. 2023-08-26 22:35:29 +02:00
retrooper e8144ece97 Minor fix to 1.12 item type mappings. 2023-08-24 18:42:48 +02:00
26 changed files with 309 additions and 87 deletions

No files matched your search

+5 -12
View File
@@ -1,15 +1,17 @@
# packetevents
[![](https://jitpack.io/v/retrooper/packetevents.svg)](https://jitpack.io/#retrooper/packetevents)
[![](https://img.shields.io/badge/License-GPLv3-yellow.svg)](https://github.com/retrooper/packetevents/blob/2.0/LICENSE) [![](https://github.com/retrooper/packetevents/actions/workflows/build.yml/badge.svg)](https://github.com/retrooper/packetevents/actions) [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?style=for-the-badge&logo=discord&logoColor=white)](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/images/product_banners/jprofiler_small.png)](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://www.gnu.org/graphics/gplv3-with-text-136x68.png)](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();
}
@@ -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());
}
}
}
@@ -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);
}
@@ -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) {
@@ -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;
@@ -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());
}
}
@@ -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);
@@ -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;
}
}
@@ -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) {
@@ -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
View File
@@ -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
@@ -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()) {
@@ -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) {
@@ -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;
}
}
@@ -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
@@ -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);
@@ -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;
}
}