PacketSendEvent#getPostTasks now working

This commit is contained in:
retrooper committed 2022-01-21 22:41:43 +01:00
1 parent 4549b8305e
commit c4f6ea71b4
4 files changed
+70 -43

No files matched your search

@@ -29,61 +29,60 @@ import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
public class PacketSendEvent extends ProtocolPacketEvent<Object> {
private boolean cloned;
private Runnable postTask = null;
private List<Runnable> postTasks = new ArrayList<>();
public PacketSendEvent(ChannelAbstract channel, Object player, ByteBufAbstract byteBuf, Runnable postTask) {
public PacketSendEvent(ChannelAbstract channel, Object player, ByteBufAbstract byteBuf, List<Runnable> postTasks) {
super(PacketSide.SERVER, channel, player, byteBuf);
this.postTask = postTask;
this.postTasks = postTasks;
}
public PacketSendEvent(ConnectionState connectionState, ChannelAbstract channel, Object player, ByteBufAbstract byteBuf, Runnable postTask) {
public PacketSendEvent(ConnectionState connectionState, ChannelAbstract channel, Object player,
ByteBufAbstract byteBuf, List<Runnable> postTasks) {
super(PacketSide.SERVER, connectionState, channel, player, byteBuf);
this.postTask = postTask;
this.postTasks = postTasks;
}
public PacketSendEvent(Object channel, Object player, Object rawByteBuf, Runnable postTask) {
public PacketSendEvent(Object channel, Object player, Object rawByteBuf, List<Runnable> postTasks) {
super(PacketSide.SERVER, channel, player, rawByteBuf);
this.postTask = postTask;
this.postTasks = postTasks;
}
public PacketSendEvent(ConnectionState connectionState, Object channel, Object player, Object rawByteBuf, Runnable postTask) {
public PacketSendEvent(ConnectionState connectionState, Object channel, Object player, Object rawByteBuf, List<Runnable> postTasks) {
super(PacketSide.SERVER, connectionState, channel, player, rawByteBuf);
this.postTask = postTask;
this.postTasks = postTasks;
}
public PacketSendEvent(ChannelAbstract channel, Object player, ByteBufAbstract byteBuf) {
super(PacketSide.SERVER, channel, player, byteBuf);
this.postTask = null;
}
public PacketSendEvent(ConnectionState connectionState, ChannelAbstract channel, Object player, ByteBufAbstract byteBuf) {
super(PacketSide.SERVER, connectionState, channel, player, byteBuf);
this.postTask = null;
}
public PacketSendEvent(Object channel, Object player, Object rawByteBuf) {
super(PacketSide.SERVER, channel, player, rawByteBuf);
this.postTask = null;
}
public PacketSendEvent(ConnectionState connectionState, Object channel, Object player, Object rawByteBuf) {
super(PacketSide.SERVER, connectionState, channel, player, rawByteBuf);
this.postTask = null;
}
public PacketSendEvent(boolean cloned, int packetID, PacketTypeCommon packetType, ServerVersion serverVersion, ClientVersion clientVersion, InetSocketAddress socketAddress, ConnectionState connectionState, ChannelAbstract channel, Object player, ByteBufAbstract byteBuf) {
super(packetID, packetType, serverVersion, clientVersion, socketAddress, connectionState, channel, player, byteBuf);
}
public Runnable getPostTask() {
return postTask;
public List<Runnable> getPostTasks() {
return postTasks;
}
public void setPostTask(Runnable postTask) {
this.postTask = postTask;
public void setPostTasks(List<Runnable> postTasks) {
this.postTasks = postTasks;
}
public boolean isCloned() {
@@ -24,32 +24,25 @@ import com.github.retrooper.packetevents.event.PacketListenerPriority;
import com.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
import com.github.retrooper.packetevents.event.impl.PacketSendEvent;
import com.github.retrooper.packetevents.manager.npc.NPC;
import com.github.retrooper.packetevents.netty.channel.ChannelAbstract;
import com.github.retrooper.packetevents.protocol.item.ItemStack;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.GameProfile;
import com.github.retrooper.packetevents.protocol.player.InteractionHand;
import com.github.retrooper.packetevents.protocol.player.TextureProperty;
import com.github.retrooper.packetevents.protocol.world.Location;
import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState;
import com.github.retrooper.packetevents.util.AdventureSerializer;
import com.github.retrooper.packetevents.util.MojangAPIUtil;
import com.github.retrooper.packetevents.util.Vector3i;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientChatMessage;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity;
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientUpdateSign;
import com.github.retrooper.packetevents.wrapper.play.server.*;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerChatMessage;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSetSlot;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
import io.github.retrooper.packetevents.utils.SpigotReflectionUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.Team;
import java.util.*;
import java.util.List;
import java.util.UUID;
public class PacketEventsPlugin extends JavaPlugin {
@Override
@@ -73,7 +66,7 @@ public class PacketEventsPlugin extends JavaPlugin {
WrapperPlayClientChatMessage chatMessage = new WrapperPlayClientChatMessage(event);
String msg = chatMessage.getMessage();
String[] sp = msg.split(" ");
if (sp[0].equalsIgnoreCase("plzspawn")) {
if (sp[0].equalsIgnoreCase("plzspawn")) {
String name = sp[1];
UUID uuid = MojangAPIUtil.requestPlayerUUID(name);
player.sendMessage("Spawning " + name + " with UUID " + uuid.toString());
@@ -84,7 +77,7 @@ public class PacketEventsPlugin extends JavaPlugin {
NamedTextColor.GOLD,
Component.text("Nice prefix").color(NamedTextColor.GRAY).asComponent(),
Component.text("Nice suffix").color(NamedTextColor.AQUA).asComponent()
);
);
npc.setLocation(new Location(player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), player.getLocation().getYaw(), player.getLocation().getPitch()));
PacketEvents.getAPI().getNPCManager().spawn(event.getChannel(), npc);
player.sendMessage("Successfully spawned " + name);
@@ -112,6 +105,14 @@ public class PacketEventsPlugin extends JavaPlugin {
int slot = setSlot.getSlot();
ItemStack item = setSlot.getItem();
player.sendMessage("Set slot with window ID: " + windowID + ", slot: " + slot + ", item: " + (item.getType() != null ? item.toString() : "null item"));
} else if (event.getPacketType() == PacketType.Play.Server.ENTITY_TELEPORT) {
System.out.println("teleporot!");
final ChannelAbstract channel = event.getChannel();
event.getPostTasks().add(() -> {
WrapperPlayServerChatMessage cm = new WrapperPlayServerChatMessage(Component.text("2.0 processed spawn pig it in a post task"),
WrapperPlayServerChatMessage.ChatPosition.CHAT);
PacketEvents.getAPI().getPlayerManager().sendPacket(channel, cm);
});
}
}
};
@@ -28,14 +28,18 @@ import io.github.retrooper.packetevents.handlers.legacy.early.CompressionManager
import net.minecraft.util.io.netty.buffer.ByteBuf;
import net.minecraft.util.io.netty.channel.ChannelHandler;
import net.minecraft.util.io.netty.channel.ChannelHandlerContext;
import net.minecraft.util.io.netty.channel.ChannelPromise;
import net.minecraft.util.io.netty.handler.codec.MessageToByteEncoder;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
@ChannelHandler.Sharable
public class PacketEncoderLegacy extends MessageToByteEncoder {
public volatile Player player;
private boolean handledCompression;
private List<Runnable> postTasks = new ArrayList<>();
public void handle(ChannelHandlerContextAbstract ctx, ByteBufAbstract byteBuf) {
boolean needsCompress = handleCompressionOrder(ctx, byteBuf);
@@ -56,17 +60,27 @@ public class PacketEncoderLegacy extends MessageToByteEncoder {
if (needsCompress) {
recompress(ctx, byteBuf);
}
if (packetSendEvent.getPostTask() != null) {
((ChannelHandlerContext) ctx.rawChannelHandlerContext()).newPromise().addListener(f -> {
packetSendEvent.getPostTask().run();
});
}
postTasks.addAll(packetSendEvent.getPostTasks());
} else {
//Make the buffer unreadable for the next handlers
byteBuf.clear();
}
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
if (!postTasks.isEmpty()) {
List<Runnable> postTasks = new ArrayList<>(this.postTasks);
promise.addListener(f -> {
for (Runnable task : postTasks) {
task.run();
}
});
}
postTasks.clear();
super.write(ctx, msg, promise);
}
@Override
protected void encode(ChannelHandlerContext ctx, Object o, ByteBuf out) {
ByteBuf byteBuf = (ByteBuf) o;
@@ -29,16 +29,20 @@ import io.github.retrooper.packetevents.utils.dependencies.viaversion.CustomPipe
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.MessageToByteEncoder;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
@ChannelHandler.Sharable
public class PacketEncoderModern extends MessageToByteEncoder<Object> {
public volatile Player player;
public boolean handledCompression;
public MessageToByteEncoder<?> mcEncoder;
private List<Runnable> postTasks = new ArrayList<>();
public void handle(ChannelHandlerContextAbstract ctx, ByteBufAbstract byteBuf) {
boolean needsCompress = handleCompressionOrder(ctx, byteBuf);
@@ -59,18 +63,27 @@ public class PacketEncoderModern extends MessageToByteEncoder<Object> {
if (needsCompress) {
recompress(ctx, byteBuf);
}
//TODO Post-task
/*if (packetSendEvent.getPostTask() != null) {
((ChannelHandlerContext) ctx.rawChannelHandlerContext()).newPromise().addListener(f -> {
packetSendEvent.getPostTask().run();
});
}*/
postTasks.addAll(packetSendEvent.getPostTasks());
} else {
//Make the buffer unreadable for the next handlers
byteBuf.clear();
}
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
if (!postTasks.isEmpty()) {
List<Runnable> postTasks = new ArrayList<>(this.postTasks);
promise.addListener(f -> {
for (Runnable task : postTasks) {
task.run();
}
});
}
postTasks.clear();
super.write(ctx, msg, promise);
}
@Override
protected void encode(ChannelHandlerContext ctx, Object o, ByteBuf out) {
if (!(o instanceof ByteBuf)) {