Update Upstream

0036e06 Alter the CUI lifecycle to be more consistent and reliable (1633)
This commit is contained in:
NotMyFault
2021-06-05 11:27:27 +02:00
parent d1af6c38e7
commit 75fbe654ee
17 changed files with 326 additions and 118 deletions

View File

@ -26,7 +26,6 @@ import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.extension.platform.AbstractPlayerActor;
import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.forge.internal.NBTConverter;
import com.sk89q.worldedit.forge.net.handler.WECUIPacketHandler;
import com.sk89q.worldedit.internal.cui.CUIEvent;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
@ -57,6 +56,7 @@ import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.UUID;
@ -127,7 +127,7 @@ public class ForgePlayer extends AbstractPlayerActor {
if (params.length > 0) {
send = send + "|" + StringUtil.joinString(params, "|");
}
PacketBuffer buffer = new PacketBuffer(Unpooled.copiedBuffer(send.getBytes(WECUIPacketHandler.UTF_8_CHARSET)));
PacketBuffer buffer = new PacketBuffer(Unpooled.copiedBuffer(send, StandardCharsets.UTF_8));
SCustomPayloadPlayPacket packet = new SCustomPayloadPlayPacket(new ResourceLocation(ForgeWorldEdit.MOD_ID, ForgeWorldEdit.CUI_PLUGIN_CHANNEL), buffer);
this.player.connection.sendPacket(packet);
}
@ -249,18 +249,18 @@ public class ForgePlayer extends AbstractPlayerActor {
@Override
public SessionKey getSessionKey() {
return new SessionKeyImpl(player.getUniqueID(), player.getName().getString());
return new SessionKeyImpl(player);
}
private static class SessionKeyImpl implements SessionKey {
static class SessionKeyImpl implements SessionKey {
// If not static, this will leak a reference
private final UUID uuid;
private final String name;
private SessionKeyImpl(UUID uuid, String name) {
this.uuid = uuid;
this.name = name;
SessionKeyImpl(ServerPlayerEntity player) {
this.uuid = player.getUniqueID();
this.name = player.getName().getString();
}
@Override

View File

@ -24,6 +24,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
import com.sk89q.worldedit.event.platform.SessionIdleEvent;
import com.sk89q.worldedit.extension.platform.Platform;
import com.sk89q.worldedit.forge.net.handler.InternalPacketHandler;
import com.sk89q.worldedit.forge.net.handler.WECUIPacketHandler;
@ -49,6 +50,7 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.CommandEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickEmpty;
import net.minecraftforge.eventbus.api.Event;
@ -284,6 +286,14 @@ public class ForgeWorldEdit {
));
}
@SubscribeEvent
public void onPlayerLogOut(PlayerEvent.PlayerLoggedOutEvent event) {
if (event.getPlayer() instanceof ServerPlayerEntity) {
WorldEdit.getInstance().getEventBus()
.post(new SessionIdleEvent(new ForgePlayer.SessionKeyImpl((ServerPlayerEntity) event.getPlayer())));
}
}
/**
* Get the configuration.
*

View File

@ -27,6 +27,7 @@ import net.minecraftforge.fml.network.NetworkEvent.ClientCustomPayloadEvent;
import net.minecraftforge.fml.network.event.EventNetworkChannel;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import static com.sk89q.worldedit.forge.ForgeAdapter.adaptPlayer;
@ -34,7 +35,6 @@ public final class WECUIPacketHandler {
private WECUIPacketHandler() {
}
public static final Charset UTF_8_CHARSET = Charset.forName("UTF-8");
private static final int PROTOCOL_VERSION = 1;
private static EventNetworkChannel HANDLER = PacketHandlerUtil
.buildLenientHandler(ForgeWorldEdit.CUI_PLUGIN_CHANNEL, PROTOCOL_VERSION)
@ -47,15 +47,9 @@ public final class WECUIPacketHandler {
public static void onPacketData(ClientCustomPayloadEvent event) {
ServerPlayerEntity player = event.getSource().get().getSender();
LocalSession session = ForgeWorldEdit.inst.getSession(player);
if (session.hasCUISupport()) {
return;
}
String text = event.getPayload().toString(UTF_8_CHARSET);
String text = event.getPayload().toString(StandardCharsets.UTF_8);
final ForgePlayer actor = adaptPlayer(player);
session.handleCUIInitializationMessage(text, actor);
session.describeCUI(actor);
}
}