diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java index 169c168d58..1c8ce3a844 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java @@ -7,41 +7,311 @@ import meteordevelopment.meteorclient.events.game.OpenScreenEvent; import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; +import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; +import meteordevelopment.meteorclient.gui.widgets.WWidget; +import meteordevelopment.meteorclient.gui.utils.StarscriptTextBoxRenderer; import meteordevelopment.meteorclient.mixin.AbstractSignEditScreenAccessor; +import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.misc.MeteorStarscript; import meteordevelopment.orbit.EventHandler; +import meteordevelopment.starscript.Script; import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.block.entity.SignText; import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractBlockC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; import net.minecraft.network.packet.c2s.play.UpdateSignC2SPacket; +import net.minecraft.text.Text; +import net.minecraft.util.Hand; +import net.minecraft.util.Util; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import java.util.Arrays; +import java.util.List; public class AutoSign extends Module { - private String[] text; - public AutoSign() { - super(Categories.World, "auto-sign", "Automatically writes signs. The first sign's text will be used."); - } + private final SettingGroup front = settings.createGroup("Front"); + private final SettingGroup back = settings.createGroup("Back"); + private final SettingGroup other = settings.createGroup("Other"); + + // 4 lines at front of sign + public final Setting frontEnabled = front.add(new BoolSetting.Builder() + .name("front-enabled") + .description("Enable auto writing front of sign.") + .defaultValue(true) + .build() + ); + + private final Setting line1front = front.add(new StringSetting.Builder() + .name("front-line-1") + .description("Text in first line.") + .defaultValue("{player}") + .onChanged(strings -> recompile(strings, true, 0)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(frontEnabled::get) + .build() + ); + + private final Setting line2front = front.add(new StringSetting.Builder() + .name("front-line-2") + .description("Text in second line.") + .defaultValue("was here") + .onChanged(strings -> recompile(strings, true, 1)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(frontEnabled::get) + .build() + ); + + private final Setting line3front = front.add(new StringSetting.Builder() + .name("front-line-3") + .description("Text in third line.") + .defaultValue("{date}") + .onChanged(strings -> recompile(strings, true, 2)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(frontEnabled::get) + .build() + ); + + private final Setting line4front = front.add(new StringSetting.Builder() + .name("front-line-4") + .description("Text in fourth line.") + .defaultValue("{time}") + .onChanged(strings -> recompile(strings, true, 3)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(frontEnabled::get) + .build() + ); + + // 4 lines at back of sign + public final Setting backEnabled = back.add(new BoolSetting.Builder() + .name("back-enabled") + .description("Enable auto writing back of sign.") + .defaultValue(true) + .build() + ); + + private final Setting line1back = back.add(new StringSetting.Builder() + .name("back-line-1") + .description("Text in first line.") + .onChanged(strings -> recompile(strings, false, 0)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(backEnabled::get) + .build() + ); + + // It's MuffinTime. + private final Setting line2back = back.add(new StringSetting.Builder() + .name("back-line-2") + .description("Text in second line.") + .defaultValue("It's MeteorTime.") + .onChanged(strings -> recompile(strings, false, 1)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(backEnabled::get) + .build() + ); + + private final Setting line3back = back.add(new StringSetting.Builder() + .name("back-line-3") + .description("Text in third line.") + .onChanged(strings -> recompile(strings, false, 2)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(backEnabled::get) + .build() + ); + + private final Setting line4back = back.add(new StringSetting.Builder() + .name("back-line-4") + .description("Text in fourth line.") + .onChanged(strings -> recompile(strings, false, 3)) + .renderer(StarscriptTextBoxRenderer.class) + .visible(backEnabled::get) + .build() + ); + + // Other settings + public final Setting overwrite = other.add(new BoolSetting.Builder() + .name("overwrite-existing") + .description("Overwrite existing text on signs, when possible.") + .defaultValue(false) + .build()); @Override - public void onDeactivate() { - text = null; + public WWidget getWidget(GuiTheme theme) { + WHorizontalList list = theme.horizontalList(); + + WButton starscriptDoc = theme.button("Open Starscript documentation."); + starscriptDoc.action = () -> Util.getOperatingSystem().open("https://github.com/MeteorDevelopment/meteor-client/wiki/Starscript"); + list.add(starscriptDoc); + + WButton simpleDateFormatDoc = theme.button("Open SimpleDateFormat documentation."); + simpleDateFormatDoc.action = () -> Util.getOperatingSystem().open("https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html"); + list.add(simpleDateFormatDoc); + + return list; + } + + private BlockPos signPlaced = null; + private boolean signUpdated = false; + private boolean frontToWrite; + private boolean backToWrite; + private int expectedPacket = 0; + private final List