Skip to content

Instantly share code, notes, and snippets.

@Moulberry
Last active November 27, 2021 04:37
Show Gist options
  • Save Moulberry/b9c46c9aa3f2845d4c919c3f8a80fe94 to your computer and use it in GitHub Desktop.
Save Moulberry/b9c46c9aa3f2845d4c919c3f8a80fe94 to your computer and use it in GitHub Desktop.
Sign Input
public class PlayerInput {
private static final HashMap<UUID, Consumer<?>> callbackMap = new HashMap<>();
private static final Set<Class<?>> ignoredClasses = Sets.newHashSet(
ClientAnimationPacket.class,
ClientPongPacket.class,
ClientPlayerPositionPacket.class,
ClientPlayerRotationPacket.class,
ClientPlayerPositionAndRotationPacket.class,
ClientKeepAlivePacket.class
);
public static void doSignInput(Player player, Consumer<String> consumer) {
doSignInput(player, "Enter Value", consumer);
}
public static void doSignInput(Player player, String prompt, Consumer<String> consumer) {
UUID uuid = player.getUuid();
if(callbackMap.containsKey(uuid)) {
callbackMap.get(uuid).accept(null);
callbackMap.remove(uuid);
}
callbackMap.put(uuid, consumer);
final Point signPosition = new Vec(player.getPosition().blockX(), 0, player.getPosition().blockZ());
BlockChangePacket packet = new BlockChangePacket();
packet.blockPosition = signPosition;
packet.blockStateId = Block.OAK_SIGN.stateId();
player.getPlayerConnection().sendPacket(packet);
NBTCompound nbt = new NBTCompound();
nbt.setString("Text1", GsonComponentSerializer.gson().serialize(Component.empty()));
nbt.setString("Text2", GsonComponentSerializer.gson().serialize(Component.empty()));
nbt.setString("Text3", GsonComponentSerializer.gson().serialize(Component.text("^^^^^^^^^^^")));
nbt.setString("Text4", GsonComponentSerializer.gson().serialize(Component.text(prompt)));
BlockEntityDataPacket packet2 = new BlockEntityDataPacket();
packet2.blockPosition = signPosition;
packet2.action = 9; //Sign
packet2.nbtCompound = nbt;
player.getPlayerConnection().sendPacket(packet2);
OpenSignEditorPacket packet3 = new OpenSignEditorPacket();
packet3.signPosition = signPosition;
player.getPlayerConnection().sendPacket(packet3);
String id = "RegionParamShortStr-"+player.getUuid();
MinecraftServer.getGlobalEventHandler().removeChildren(id);
EventNode<PlayerEvent> node = EventNode.type(id, EventFilter.PLAYER, (playerevent, p) -> player == p).setPriority(999);
node.addListener(PlayerPacketEvent.class, (event) -> {
if(event.getPacket() instanceof ClientUpdateSignPacket) {
ClientUpdateSignPacket updateSign = (ClientUpdateSignPacket) event.getPacket();
callbackMap.remove(uuid);
MinecraftServer.getGlobalEventHandler().removeChildren(id);
if(event.getPlayer().getInstance() != null) {
BlockChangePacket blockChangePacket = new BlockChangePacket();
blockChangePacket.blockPosition = signPosition;
blockChangePacket.blockStateId = event.getPlayer().getInstance().getBlock(signPosition).stateId();
player.getPlayerConnection().sendPacket(blockChangePacket);
}
consumer.accept(updateSign.line1 + updateSign.line2);
} else if(!ignoredClasses.contains(event.getPacket().getClass())) {
callbackMap.remove(uuid);
MinecraftServer.getGlobalEventHandler().removeChildren(id);
if(event.getPlayer().getInstance() != null) {
BlockChangePacket blockChangePacket = new BlockChangePacket();
blockChangePacket.blockPosition = signPosition;
blockChangePacket.blockStateId = event.getPlayer().getInstance().getBlock(signPosition).stateId();
player.getPlayerConnection().sendPacket(blockChangePacket);
}
consumer.accept(null);
}
});
node.addListener(PlayerDisconnectEvent.class, (event) -> {
MinecraftServer.getGlobalEventHandler().removeChildren(id);
});
MinecraftServer.getGlobalEventHandler().addChild(node);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment