Implement sign editor packets

This commit is contained in:
Gabriel Tofvesson 2021-07-24 21:37:20 +02:00
parent 96261af9f8
commit 028df0a340

View File

@ -1,6 +1,9 @@
package dev.w1zzrd.spigot.wizcompat.packet;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import java.lang.reflect.Array;
@ -75,4 +78,34 @@ public final class Players {
return reflectGetField(player, "entity");
}
public static void openSignEditor(final Player target, final Location where) {
// Must edit a non-editable sign
final BlockState targetState = where.getBlock().getState();
if (!(targetState instanceof Sign) || ((Sign)targetState).isEditable())
return;
final Object tileSign = reflectGetField(targetState, "tileEntity");
// Make editable by player
reflectInvoke(tileSign, new String[]{ "a" }, target.getUniqueId());
reflectInvoke(tileSign, new String[]{ "a" }, true);
final Class<?> type_PacketPlayOutOpenSignEditor = loadClass(
getNativePacketPackage(target),
"PacketPlayOutOpenSignEditor", "game.PacketPlayOutOpenSignEditor"
);
assert type_PacketPlayOutOpenSignEditor != null;
Packets.sendPacket(
target,
reflectConstruct(
type_PacketPlayOutOpenSignEditor,
reflectConstruct(
type_PacketPlayOutOpenSignEditor.getDeclaredFields()[0].getType(), // Only declares one field
where.getBlockX(),
where.getBlockY(),
where.getBlockZ()
)));
}
}