From 5c7bd6452ee26af94fd302efa8870a6dee1045d2 Mon Sep 17 00:00:00 2001 From: MeexReay <127148610+MeexReay@users.noreply.github.com> Date: Mon, 29 May 2023 23:15:34 +0300 Subject: [PATCH] sussy update --- .../themixray/repeating/mod/EasyConfig.java | 68 ++++++ .../repeating/mod/RepeatingScreen.java | 211 ++++++++++++++++++ .../repeating/mod/mixin/InputMixin.java | 30 +++ .../assets/minecraft/font/default.json | 17 ++ .../assets/repeating-mod/textures/ui/loop.png | Bin 0 -> 224 bytes .../repeating-mod/textures/ui/no-loop.png | Bin 0 -> 224 bytes src/main/resources/icon.png | Bin 0 -> 1273 bytes 7 files changed, 326 insertions(+) create mode 100644 src/main/java/themixray/repeating/mod/EasyConfig.java create mode 100644 src/main/java/themixray/repeating/mod/RepeatingScreen.java create mode 100644 src/main/java/themixray/repeating/mod/mixin/InputMixin.java create mode 100644 src/main/resources/assets/minecraft/font/default.json create mode 100644 src/main/resources/assets/repeating-mod/textures/ui/loop.png create mode 100644 src/main/resources/assets/repeating-mod/textures/ui/no-loop.png create mode 100644 src/main/resources/icon.png diff --git a/src/main/java/themixray/repeating/mod/EasyConfig.java b/src/main/java/themixray/repeating/mod/EasyConfig.java new file mode 100644 index 0000000..0a2843a --- /dev/null +++ b/src/main/java/themixray/repeating/mod/EasyConfig.java @@ -0,0 +1,68 @@ +package themixray.repeating.mod; + +import org.json.simple.JSONValue; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.io.File; + +public class EasyConfig { + public final Path path; + public final File file; + public Map data; + + public EasyConfig(Path path, Map def) { + this.path = path; + this.file = path.toFile(); + this.data = new HashMap<>(); + + if (!file.exists()) { + try { + file.createNewFile(); + write(def); + } catch (IOException e) { + e.printStackTrace(); + } + } + reload(); + } + + public EasyConfig(Path path) { + this(path,new HashMap<>()); + } + + public void reload() { + data = read(); + } + + public void save() { + write(data); + } + + private String toJson(Map p) { + return JSONValue.toJSONString(p); + } + + private Map toMap(String j) { + return (Map) JSONValue.parse(j); + } + + private Map read() { + try { + return toMap(Files.readString(path)); + } catch (IOException e) { + e.printStackTrace(); + } + return new HashMap<>(); + } + + private void write(Map p) { + try { + Files.write(path,toJson(p).getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/themixray/repeating/mod/RepeatingScreen.java b/src/main/java/themixray/repeating/mod/RepeatingScreen.java new file mode 100644 index 0000000..639a68a --- /dev/null +++ b/src/main/java/themixray/repeating/mod/RepeatingScreen.java @@ -0,0 +1,211 @@ +package themixray.repeating.mod; + +import io.wispforest.owo.ui.base.*; +import io.wispforest.owo.ui.component.*; +import io.wispforest.owo.ui.container.*; +import io.wispforest.owo.ui.container.FlowLayout; +import io.wispforest.owo.ui.core.*; +import io.wispforest.owo.ui.core.Insets; +import io.wispforest.owo.util.EventSource; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.ResourceType; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.OpenOption; +import java.nio.file.Path; + +public class RepeatingScreen extends BaseOwoScreen { + public RepeatingMod mod; + public ButtonComponent replay_btn; + public ButtonComponent record_btn; + public ButtonComponent loop_btn; + + public RepeatingScreen() { + this.mod = RepeatingMod.me; + } + + @Override + protected @NotNull OwoUIAdapter createAdapter() { + return OwoUIAdapter.create(this, Containers::horizontalFlow); + } + + public void update_btns() { + replay_btn.setMessage(Text.translatable("text.repeating-mod." + + ((mod.is_replaying) ? "stop" : "start")).append(" ") + .append(Text.translatable("text.repeating-mod.replay"))); + record_btn.setMessage(Text.translatable("text.repeating-mod." + + ((mod.is_recording) ? "stop" : "start")).append(" ") + .append(Text.translatable("text.repeating-mod.record"))); + loop_btn.setMessage(Text.of(((mod.loop_replay) ? "\uefff" : "\ueffe"))); + } + + @Override + protected void build(FlowLayout rootComponent) { + rootComponent + .surface(Surface.VANILLA_TRANSLUCENT) + .horizontalAlignment(HorizontalAlignment.CENTER) + .verticalAlignment(VerticalAlignment.CENTER); + + replay_btn = (ButtonComponent) Components.button(Text.of("replay"), + (ButtonComponent btn) -> { + if (!mod.is_recording) { + if (mod.is_replaying) + mod.stopReplay(); + else mod.startReplay(); + update_btns(); + } + }).margins(Insets.of(1)).sizing( + Sizing.fixed(98),Sizing.fixed(20)); + + loop_btn = (ButtonComponent) Components.button(Text.of(""), + (ButtonComponent btn) -> { + mod.loop_replay = !mod.loop_replay; + update_btns(); + }).margins(Insets.of(1)) + .sizing(Sizing.fixed(20),Sizing.fixed(20)); + + record_btn = (ButtonComponent) Components.button(Text.of("record"), + (ButtonComponent btn) -> { + if (!mod.is_replaying) { + if (mod.is_recording) + mod.stopRecording(); + else mod.startRecording(); + update_btns(); + } + }).margins(Insets.of(1)).sizing( + Sizing.fixed(120),Sizing.fixed(20)); + + rootComponent.child( + Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Components.label(Text.translatable("text.repeating-mod.basic")).margins(Insets.of(1))) + .padding(Insets.of(5)) + .surface(Surface.DARK_PANEL) + .verticalAlignment(VerticalAlignment.CENTER) + .horizontalAlignment(HorizontalAlignment.CENTER) + .margins(Insets.of(1))) + .child(Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Containers.horizontalFlow(Sizing.content(), Sizing.content()) + .child(replay_btn).child(loop_btn)) + .child(record_btn) + .child(Components.button(Text.translatable( + "text.repeating-mod.export"), + (ButtonComponent btn) -> { + String t = ""; + for (int i = 0; i < mod.record.size(); i++) { + t += mod.record.get(i).toText(); + if (i != mod.record.size()-1) + t += ";"; + } + + File p = new File(FabricLoader.getInstance().getGameDir().toFile(),"repeating"); + if (!p.exists()) p.mkdir(); + File file = new File(p,"export.txt"); + + try { + if (!file.exists()) file.createNewFile(); + Files.write(file.toPath(), t.getBytes()); + Runtime.getRuntime().exec("explorer /select,\""+file.getAbsolutePath()+"\""); + } catch (Exception e) { + e.printStackTrace(); + } + }).margins(Insets.of(10,1,1,1)).sizing( + Sizing.fixed(120),Sizing.fixed(20))) + .child(Components.button(Text.translatable( + "text.repeating-mod.import"), + (ButtonComponent btn) -> { + mod.record.clear(); + + File p = new File(FabricLoader.getInstance().getGameDir().toFile(),"repeating"); + if (!p.exists()) p.mkdir(); + File file = new File(p,"import.txt"); + + try { + if (!file.exists()) { + file.createNewFile(); + Runtime.getRuntime().exec("explorer /select,\""+file.getAbsolutePath()+"\""); + return; + } + String t = Files.readString(file.toPath()); + for (String s:t.split(";")) + mod.record.add(RepeatingMod.RecordEvent.fromText(s)); + } catch (Exception e) { + e.printStackTrace(); + } + }).margins(Insets.of(1)).sizing( + Sizing.fixed(120),Sizing.fixed(20))) + .padding(Insets.of(10)) + .surface(Surface.DARK_PANEL) + .verticalAlignment(VerticalAlignment.CENTER) + .horizontalAlignment(HorizontalAlignment.CENTER) + .margins(Insets.of(1))) + /*).child( + Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Components.label(Text.translatable("text.repeating-mod.parkour")).margins(Insets.of(1))) + .padding(Insets.of(5)) + .surface(Surface.DARK_PANEL) + .verticalAlignment(VerticalAlignment.CENTER) + .horizontalAlignment(HorizontalAlignment.CENTER) + .margins(Insets.of(1))) + .child(Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Components.label(Text.translatable("text.repeating-mod.dev")).margins(Insets.of(1))) + .padding(Insets.of(10)) + .surface(Surface.DARK_PANEL) + .verticalAlignment(VerticalAlignment.CENTER) + .horizontalAlignment(HorizontalAlignment.CENTER) + .margins(Insets.of(1)))*/ + ).child( + Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Components.label(Text.translatable("text.repeating-mod.settings")).margins(Insets.of(1))) + .padding(Insets.of(5)) + .surface(Surface.DARK_PANEL) + .verticalAlignment(VerticalAlignment.CENTER) + .horizontalAlignment(HorizontalAlignment.CENTER) + .margins(Insets.of(1))) + .child(Containers.verticalFlow(Sizing.content(), Sizing.content()) + .child(Components.discreteSlider(Sizing.fixed(120),0,5) + .decimalPlaces(2) + .setFromDiscreteValue(mod.record_blocks_limit) + .message((String s)->{ + mod.record_blocks_limit = Double.parseDouble(s.replace(",",".")); + mod.conf.data.put("record_blocks_limit",mod.record_blocks_limit); + mod.conf.save(); + return Text.translatable("text.repeating-mod.block_limit",s); + }).scrollStep(0.2) + .margins(Insets.of(1)) + .tooltip(Text.translatable("text.repeating-mod.block_limit_tooltip"))) + .child(Components.discreteSlider(Sizing.fixed(120),0,1000) + .decimalPlaces(0) + .setFromDiscreteValue(mod.record_time_limit) + .message((String s)->{ + mod.record_time_limit = (long) Double.parseDouble(s.replace(",",".")); + mod.conf.data.put("record_time_limit",mod.record_time_limit); + mod.conf.save(); + return Text.translatable("text.repeating-mod.time_limit",s); + }).scrollStep(2) + .margins(Insets.of(1)) + .tooltip(Text.translatable("text.repeating-mod.time_limit_tooltip"))) + .padding(Insets.of(10)) + .surface(Surface.DARK_PANEL) + .verticalAlignment(VerticalAlignment.CENTER) + .horizontalAlignment(HorizontalAlignment.CENTER) + .margins(Insets.of(1))) + ); + update_btns(); + } +} diff --git a/src/main/java/themixray/repeating/mod/mixin/InputMixin.java b/src/main/java/themixray/repeating/mod/mixin/InputMixin.java new file mode 100644 index 0000000..5f3874e --- /dev/null +++ b/src/main/java/themixray/repeating/mod/mixin/InputMixin.java @@ -0,0 +1,30 @@ +package themixray.repeating.mod.mixin; + +import net.minecraft.client.input.KeyboardInput; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import themixray.repeating.mod.RepeatingMod; + +@Mixin(KeyboardInput.class) +public abstract class InputMixin { + @Inject(at = @At(value = "TAIL"), method = "tick") + private void onTickTail(boolean slowDown, float f, CallbackInfo ci) { + if (RepeatingMod.me.is_replaying) { + RepeatingMod.client.player.input.sneaking = RepeatingMod.replay_sneaking; + } + } + + @Inject(at = @At(value = "HEAD"), method = "tick") + private void onTickHead(boolean slowDown, float f, CallbackInfo ci) { + if (RepeatingMod.me.is_recording) { + RepeatingMod.RecordSneakEvent e = new RepeatingMod. + RecordSneakEvent(RepeatingMod.client.player.input.sneaking); + RepeatingMod.RecordSneakEvent l = ((RepeatingMod.RecordSneakEvent) + RepeatingMod.me.getLastRecord("sneak")); + if (l == null || l.sneaking != e.sneaking) + RepeatingMod.me.recordTick(e); + } + } +} diff --git a/src/main/resources/assets/minecraft/font/default.json b/src/main/resources/assets/minecraft/font/default.json new file mode 100644 index 0000000..6501fb4 --- /dev/null +++ b/src/main/resources/assets/minecraft/font/default.json @@ -0,0 +1,17 @@ +{ + "providers": [ + { + "file":"repeating-mod:ui/no-loop.png", + "chars":["\ueffe"], + "height":16, + "ascent":12, + "type":"bitmap" + },{ + "file":"repeating-mod:ui/loop.png", + "chars":["\uefff"], + "height":16, + "ascent":12, + "type":"bitmap" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/repeating-mod/textures/ui/loop.png b/src/main/resources/assets/repeating-mod/textures/ui/loop.png new file mode 100644 index 0000000000000000000000000000000000000000..706aff42b4a4fbc9c5d804588884213a3a4171f6 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0G|+7hI&5H|3D6deXuJ?khvttFZlm|hU=$zfod5z3p^r=85sBufiR<} zhF1enFwoP*F+?LcwwIBQL6PUsvw#0zEEafPbYz7|bLjt+fUgw?DqH&5Tml-_9ASO< zVsfXkf-LuvV#eFD8`UcvrPwPLhqF&O*TP$?(a1XEbF%TPe+NS%G}c0G|-odIpC7KsEz|$6h}UAjMn~ZGJ;uxY49NWvt$Dqh_=-I#jFBS_tFFLZqq&f6|O2F5O1C=fPY%T!}YmTr! zd@;GxSV5M1NipMX*^TOzj#BIui^JI`oNM8&)o5g$@j2P})jx*i4;ZcYb+PLL4QKFl L^>bP0l+XkKPI^Ns literal 0 HcmV?d00001 diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0987b0736c9a3e49f7d36094b8f186aece88780 GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^4Is<`Bp9BB+KB@xmUKs7M+SzC{oH>NS%G|oWRDFdh=oK=>e!KD42kpfVNF~7(!gz@~M@>xKRYKdz^NlIc#s#S7PDv)9@GB7gMH89mR zvJ5dawK6cUGBwf$k_HB`Wm7FtH00)|WTsVO(O?MCAbZ$c0;nM>HNrE^*Ox&H$mU>R zWfWpy2C^7|kbzN(0pvR%i@}Rg8qN-4)PSmC0(wUnp&qCX1U!Hkqz6pP2YokTU|{a^ zba4!+xb=3n^{gcd0u8*jvyLl#;kc7-l`{#8A z`09V;wZAj9I6Xi|;@ZV+ijfr&*Wy%}zRu<=c`!B9R3{7f`+ug~vyMj?E0R*Lshm{WpvQP3^Ze%fogTXx7A(@cUDs~H#~fqcAH~Ty#h{*X zLC?>;6Kp#qs=cP=Fhm`)k!rqJ`9RBI+B!y)hJHqcP{tYcD?jis)F$x-Nb@dW+{4VU zlIw$uk^|#B50)LB{0tIV%sN{cnY>@SGw7|*W?FMTH8m?alfk{Q!tj;U;qDig1OoJ` z1wTq~GOIJ@v`QqFn!J`O(>=X)v%;>B2G_``U#&Y^ug%HPl`iDAIIv*Ns$YtRZ5r!T z1GlHJ9b7c;p>60@5r&K6qVj6Bi#M%Lc_lET|HC>x!Gz)idm?4ObX>U}CY=?zF)P8{ z){s3xx_p1F;^yU7<`%DXeUM`HO3zS;;oG`v_Vp?AgV>)0W%XP(eV}Lfh_Pk0V6#T@|V0iBG5^KE<_6cP(`?Po-NT|0bnXo&s{tlcq$&&Hi!95;3 z*PmBuIC^`+e`S%jf0u*)rVj{UUAF$eiWs35(nP+Yox4&f< za%4GBXKImbkaYLfx|Slfc^qdNe@wA0=3EmoKk##`0>_p~OlPM~vRWN$eN8j(pV!nb z*^*;j)|K++@(s6MzrBz$oqa=M(c9_TBA0YNzYkog63TeN=L-wNtj>816~A*=vt3}2 za$wG2;C&#@d_>NEKX=0)mv_7GF;DnVQNZqS$?&{1gW3D_{mX0btnX%CGOtLNSHZ00 z(R{zQO$VEl^J3az4b{}(L*g4m1sa%o!USaj$6Rx~bm*4oEX~Pe@ z8Bc0UzX?`f*zIR~P=14noWuKNE5!M@WOn#YGp~BR^xtlKQ^~#qE6v0|-JRc`exbPV m|IRA{&aMr7>x|4R(|_`RYRFC%cF{BfWmivEKbLh*2~7YLFWUqF literal 0 HcmV?d00001