Added book color functionality to ColorSigns (#338)

This commit is contained in:
Riba Dániel
2024-04-09 19:21:06 +02:00
committed by GitHub
parent abb9663305
commit f1a204e7ad

View File

@@ -2,30 +2,63 @@ package anticope.rejects.modules;
import anticope.rejects.MeteorRejectsAddon; import anticope.rejects.MeteorRejectsAddon;
import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent;
import meteordevelopment.meteorclient.settings.BoolSetting;
import meteordevelopment.meteorclient.settings.Setting;
import meteordevelopment.meteorclient.settings.SettingGroup;
import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventHandler;
import net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket;
import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket;
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
import net.minecraft.server.MinecraftServer;
import java.util.List;
public class ColorSigns extends Module { public class ColorSigns extends Module {
private final SettingGroup sgGeneral = settings.getDefaultGroup();
private final Setting<Boolean> signs = sgGeneral.add(new BoolSetting.Builder()
.name("signs")
.description("Allows you to use colors in signs.")
.defaultValue(true)
.build()
);
private final Setting<Boolean> books = sgGeneral.add(new BoolSetting.Builder()
.name("books")
.description("Allows you to use colors in books.")
.defaultValue(false)
.build()
);
public ColorSigns() { public ColorSigns() {
super(MeteorRejectsAddon.CATEGORY, "color-signs", "Allows you to use colors on signs on NON-PAPER servers (use \"&\" for color symbols)"); super(MeteorRejectsAddon.CATEGORY, "color-signs", "Allows you to use colors on signs on NON-PAPER servers (use \"&\" for color symbols)");
} }
@EventHandler @EventHandler
private void onPacketSend(PacketEvent.Send event) { private void onPacketSend(PacketEvent.Send event) {
if (event.packet instanceof GameJoinS2CPacket) { if (event.packet instanceof GameJoinS2CPacket) {
checkWarning(); checkWarning();
return; return;
} }
if (!(event.packet instanceof UpdateSignC2SPacket)) return; if (signs.get() && event.packet instanceof UpdateSignC2SPacket packet) {
UpdateSignC2SPacket p = (UpdateSignC2SPacket)event.packet; for (int line = 0; line < packet.getText().length; line++) {
for (int l = 0; l < p.getText().length; l++) { packet.getText()[line] = packet.getText()[line]
String newText = p.getText()[l].replaceAll("(?i)\u00a7|&([0-9A-FK-OR])", "\u00a7\u00a7$1$1"); .replaceAll("(?i)(?:&|(?<!§)§)([0-9A-Z])", "§§$1$1");
p.getText()[l] = newText; }
}
if (books.get() && event.packet instanceof BookUpdateC2SPacket packet) {
List<String> newPages = packet.getPages().stream().map(text ->
text.replaceAll("(?i)&([0-9A-Z])", "§$1")).toList();
// BookUpdateC2SPacket.pages is final, so we need to create a new packet
if (!packet.getPages().equals(newPages)) {
assert mc.getNetworkHandler() != null;
mc.getNetworkHandler().sendPacket(new BookUpdateC2SPacket(
packet.getSlot(), newPages, packet.getTitle()));
event.cancel();
}
} }
event.packet = p;
} }
@Override @Override
@@ -35,7 +68,10 @@ public class ColorSigns extends Module {
} }
private void checkWarning() { private void checkWarning() {
String brand = mc.player.getServer().getServerModName(); assert mc.player != null;
MinecraftServer server = mc.player.getServer();
if (server == null) return;
String brand = server.getServerModName();
if (brand == null) return; if (brand == null) return;
if (brand.contains("Paper")) warning("You are on a paper server. Color signs won't work here"); if (brand.contains("Paper")) warning("You are on a paper server. Color signs won't work here");
} }