PacketSendEvent#getPostTasks now working
This commit is contained in:
1 parent
4549b8305e
commit
c4f6ea71b4
4 files changed
+70
-43
No files matched your search
+16
-17
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
+20
-6
@@ -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;
|
||||
|
||||
+19
-6
@@ -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)) {
|
||||
|
||||
Reference in new issue
Block a user