diff --git a/gradle.properties b/gradle.properties index 780fbef..49aab6b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,17 +4,17 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.6 -yarn_mappings=1.21.6+build.1 +minecraft_version=1.21 +yarn_mappings=1.21+build.9 loader_version=0.16.14 loom_version=1.10-SNAPSHOT # Fabric API -fabric_version=0.127.0+1.21.6 +fabric_version=0.102.0+1.21 # Mod Properties -mod_version = 1.1.2+1.21.6 +mod_version = 1.1.2+1.21 maven_group = ru.themixray archives_base_name = repeating-mod -# Compatible with: 1.21.6 \ No newline at end of file +# Compatible with: 1.21, 1.21.1 \ No newline at end of file diff --git a/src/main/java/ru/themixray/repeating_mod/Main.java b/src/main/java/ru/themixray/repeating_mod/Main.java index 296904c..17cf367 100644 --- a/src/main/java/ru/themixray/repeating_mod/Main.java +++ b/src/main/java/ru/themixray/repeating_mod/Main.java @@ -209,14 +209,46 @@ public class Main implements ClientModInitializer { return; } - InputEvent curr = InputEvent.current(); - if (curr == null) return; + InputEvent l = ((InputEvent) now_record.getLastEvent("input")); + if (l == null) { + InputEvent e = new InputEvent( + client.player.input.sneaking, + client.player.input.jumping, + client.player.input.movementSideways, + client.player.input.movementForward, + client.player.input.pressingForward, + client.player.input.pressingBack, + client.player.input.pressingLeft, + client.player.input.pressingRight, + client.player.getHeadYaw(), + client.player.getBodyYaw(), + client.player.getPitch(), + client.player.isSprinting(), + client.player.getYaw(), + client.player.getMovementSpeed()); + recordTick(e); + } else { + InputEvent e = new InputEvent( + ((Boolean) client.player.input.sneaking == l.sneaking) ? null : client.player.input.sneaking, + ((Boolean) client.player.input.jumping == l.jumping) ? null : client.player.input.jumping, + (((Float) client.player.input.movementSideways).equals(l.movementSideways)) ? null : client.player.input.movementSideways, + (((Float) client.player.input.movementForward).equals(l.movementForward)) ? null : client.player.input.movementForward, + ((Boolean) client.player.input.pressingForward == l.pressingForward) ? null : client.player.input.pressingForward, + ((Boolean) client.player.input.pressingBack == l.pressingBack) ? null : client.player.input.pressingBack, + ((Boolean) client.player.input.pressingLeft == l.pressingLeft) ? null : client.player.input.pressingLeft, + ((Boolean) client.player.input.pressingRight == l.pressingRight) ? null : client.player.input.pressingRight, + client.player.getHeadYaw(), Main.client.player.getBodyYaw(),client.player.getPitch(), + ((Boolean) client.player.isSprinting() == l.sprinting) ? null : client.player.isSprinting(), + client.player.getYaw(),client.player.getMovementSpeed()); - InputEvent last = ((InputEvent) now_record.getLastEvent("input")); - if (last == null) { - recordTick(curr); - } else if (!curr.equals(last)) { - recordTick(curr.differs(last)); + if (!(e.isEmpty() && + e.yaw == l.yaw && + e.head_yaw == l.head_yaw && + e.pitch == l.pitch && + e.body_yaw == l.body_yaw)) { + e.fillEmpty(l); + recordTick(e); + } } } @@ -300,10 +332,10 @@ public class Main implements ClientModInitializer { client.player.sendMessage(Text.literal("[") .append(Text.translatable("text.repeating-mod.name")) .append("] ").formatted(Formatting.BOLD,Formatting.DARK_GRAY) - .append(text.formatted(Formatting.RESET).formatted(Formatting.GRAY)), false); + .append(text.formatted(Formatting.RESET).formatted(Formatting.GRAY))); } -// public static void sendDebug(String s) { -// client.player.sendMessage(Text.literal("[DEBUG] ").append(Text.of(s)), false); -// } + public static void sendDebug(String s) { + client.player.sendMessage(Text.literal("[DEBUG] ").append(Text.of(s))); + } } diff --git a/src/main/java/ru/themixray/repeating_mod/RepeatingScreen.java b/src/main/java/ru/themixray/repeating_mod/RepeatingScreen.java index 0783386..8d95918 100644 --- a/src/main/java/ru/themixray/repeating_mod/RepeatingScreen.java +++ b/src/main/java/ru/themixray/repeating_mod/RepeatingScreen.java @@ -51,7 +51,7 @@ public class RepeatingScreen extends Screen { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { -// renderBackground(context, mouseX, mouseY, delta); + renderBackground(context, mouseX, mouseY, delta); for (RenderListener l : render_listeners) { if (l.beforeRender()) { diff --git a/src/main/java/ru/themixray/repeating_mod/event/events/BlockInteractEvent.java b/src/main/java/ru/themixray/repeating_mod/event/events/BlockInteractEvent.java index 16a8425..789ea8f 100644 --- a/src/main/java/ru/themixray/repeating_mod/event/events/BlockInteractEvent.java +++ b/src/main/java/ru/themixray/repeating_mod/event/events/BlockInteractEvent.java @@ -19,7 +19,7 @@ public class BlockInteractEvent extends RecordEvent { Double.parseDouble(a[0]), Double.parseDouble(a[1]), Double.parseDouble(a[2])), - Direction.byIndex(Integer.parseInt(a[4])), + Direction.byId(Integer.parseInt(a[4])), new BlockPos( Integer.parseInt(a[0]), Integer.parseInt(a[1]), @@ -44,7 +44,7 @@ public class BlockInteractEvent extends RecordEvent { String.valueOf(hitResult.getBlockPos().getY()), String.valueOf(hitResult.getBlockPos().getZ()), (hitResult.isInsideBlock() ? "1" : "0"), - String.valueOf(hitResult.getSide().getIndex()), + String.valueOf(hitResult.getSide().getId()), hand.name() }; } diff --git a/src/main/java/ru/themixray/repeating_mod/event/events/InputEvent.java b/src/main/java/ru/themixray/repeating_mod/event/events/InputEvent.java index 01d1f39..74be7c5 100644 --- a/src/main/java/ru/themixray/repeating_mod/event/events/InputEvent.java +++ b/src/main/java/ru/themixray/repeating_mod/event/events/InputEvent.java @@ -1,156 +1,114 @@ package ru.themixray.repeating_mod.event.events; -import net.minecraft.client.input.Input; -import net.minecraft.util.PlayerInput; -import net.minecraft.util.math.Vec2f; import ru.themixray.repeating_mod.Main; import ru.themixray.repeating_mod.event.RecordEvent; -import java.lang.reflect.Field; - public class InputEvent extends RecordEvent { - public Boolean forward; - public Boolean backward; - public Boolean left; - public Boolean right; - public Boolean jump; - public Boolean sneak; - public Boolean sprint; + public Boolean sneaking; + public Boolean jumping; + public Boolean pressingForward; + public Boolean pressingBack; + public Boolean pressingLeft; + public Boolean pressingRight; + public Boolean sprinting; + + public Float movementSideways; + public Float movementForward; public float yaw; public float head_yaw; public float body_yaw; public float pitch; public float speed; - public float movementForward; - public float movementSideways; - public static InputEvent current() { - if (Main.client.player == null) return null; - return new InputEvent( - Main.client.player.input.playerInput.forward(), - Main.client.player.input.playerInput.backward(), - Main.client.player.input.playerInput.left(), - Main.client.player.input.playerInput.right(), - Main.client.player.input.playerInput.jump(), - Main.client.player.input.playerInput.sneak(), - Main.client.player.input.playerInput.sprint(), - Main.client.player.getHeadYaw(), - Main.client.player.getBodyYaw(), - Main.client.player.getPitch(), - Main.client.player.getYaw(), - Main.client.player.getMovementSpeed(), - Main.client.player.input.getMovementInput().y, - Main.client.player.input.getMovementInput().x - ); - } - - public InputEvent(Boolean forward, - Boolean backward, - Boolean left, - Boolean right, - Boolean jump, - Boolean sneak, - Boolean sprint, + public InputEvent(Boolean sneaking, + Boolean jumping, + Float movementSideways, + Float movementForward, + Boolean pressingForward, + Boolean pressingBack, + Boolean pressingLeft, + Boolean pressingRight, float head_yaw, float body_yaw, float head_pitch, + Boolean sprinting, float yaw, - float speed, - float movementForward, - float movementSideways) { - this.forward = forward; - this.backward = backward; - this.left = left; - this.right = right; - this.jump = jump; - this.sneak = sneak; - this.sprint = sprint; - + float speed) { + this.sneaking = sneaking; + this.jumping = jumping; + this.movementSideways = movementSideways; + this.movementForward = movementForward; + this.pressingForward = pressingForward; + this.pressingBack = pressingBack; + this.pressingLeft = pressingLeft; + this.pressingRight = pressingRight; this.head_yaw = head_yaw; this.body_yaw = body_yaw; this.pitch = head_pitch; + this.sprinting = sprinting; this.yaw = yaw; this.speed = speed; - this.movementForward = movementForward; - this.movementSideways = movementSideways; - } - - /** - * Returns differences of this InputEvent to the provided one, saving first booleans if differ and first floats always - */ - public InputEvent differs(InputEvent event) { - return new InputEvent( - forward == event.forward ? null : forward, - backward == event.backward ? null : backward, - left == event.left ? null : left, - right == event.right ? null : right, - jump == event.jump ? null : jump, - sneak == event.sneak ? null : sneak, - sprint == event.sprint ? null : sprint, - head_yaw, - body_yaw, - pitch, - yaw, - speed, - movementForward, - movementSideways - ); } public static InputEvent deserialize(String[] a) { return new InputEvent( - (a[0].equals("n") ? null : a[0].equals("1")), - (a[1].equals("n") ? null : a[1].equals("1")), - (a[2].equals("n") ? null : a[2].equals("1")), - (a[3].equals("n") ? null : a[3].equals("1")), - (a[4].equals("n") ? null : a[4].equals("1")), - (a[5].equals("n") ? null : a[5].equals("1")), - (a[6].equals("n") ? null : a[6].equals("1")), - Float.parseFloat(a[7]), - Float.parseFloat(a[8]), - Float.parseFloat(a[9]), - Float.parseFloat(a[10]), - Float.parseFloat(a[11]), - Float.parseFloat(a[12]), - Float.parseFloat(a[13]) - ); + (a[0].equals("n") ? null : a[0].equals("1")), + (a[1].equals("n") ? null : a[1].equals("1")), + (a[2].equals("n") ? null : Float.parseFloat(a[2])), + (a[3].equals("n") ? null : Float.parseFloat(a[3])), + (a[4].equals("n") ? null : a[4].equals("1")), + (a[5].equals("n") ? null : a[5].equals("1")), + (a[6].equals("n") ? null : a[6].equals("1")), + (a[7].equals("n") ? null : a[7].equals("1")), + Float.parseFloat(a[8]), Float.parseFloat(a[9]), + Float.parseFloat(a[10]), + (a[11].equals("n") ? null : a[11].equals("1")), + Float.parseFloat(a[12]), + Float.parseFloat(a[13])); } protected String[] serializeArgs() { return new String[] { - ((forward == null) ? "n" : (forward ? "1" : "0")), - ((backward == null) ? "n" : (backward ? "1" : "0")), - ((left == null) ? "n" : (left ? "1" : "0")), - ((right == null) ? "n" : (right ? "1" : "0")), - ((jump == null) ? "n" : (jump ? "1" : "0")), - ((sneak == null) ? "n" : (sneak ? "1" : "0")), - ((sprint == null) ? "n" : (sprint ? "1" : "0")), - String.valueOf(head_yaw), - String.valueOf(body_yaw), - String.valueOf(pitch), - String.valueOf(yaw), - String.valueOf(speed), - String.valueOf(movementForward), - String.valueOf(movementSideways) + ((sneaking == null) ? "n" : (sneaking ? "1" : "0")), // sneaking + ((jumping == null) ? "n" : (jumping ? "1" : "0")), // jumping + ((movementSideways == null) ? "n" : String.valueOf(movementSideways)), // movement sideways + ((movementForward == null) ? "n" : String.valueOf(movementForward)), // movement forward + ((pressingForward == null) ? "n" : (pressingForward ? "1" : "0")), // pressing forward + ((pressingBack == null) ? "n" : (pressingBack ? "1" : "0")), // pressing back + ((pressingLeft == null) ? "n" : (pressingLeft ? "1" : "0")), // pressing left + ((pressingRight == null) ? "n" : (pressingRight ? "1" : "0")), // pressing right + String.valueOf(head_yaw), // head yaw + String.valueOf(body_yaw), // body yaw + String.valueOf(pitch), // pitch + ((sprinting == null) ? "n" : (sprinting ? "1" : "0")), // sprinting + String.valueOf(yaw), // yaw + String.valueOf(speed) // speed }; } - public boolean equals(InputEvent event) { - return event.forward == forward && - event.backward == backward && - event.sprint == sprint && - event.jump == jump && - event.sneak == sneak && - event.left == left && - event.right == right && - event.speed == speed && - event.head_yaw == head_yaw && - event.body_yaw == body_yaw && - event.yaw == yaw && - event.pitch == pitch && - event.movementForward == movementForward && - event.movementSideways == movementSideways; + public void fillEmpty(InputEvent e) { + if (sneaking == null) sneaking = e.sneaking; + if (jumping == null) jumping = e.jumping; + if (movementSideways == null) movementSideways = e.movementSideways; + if (movementForward == null) movementForward = e.movementForward; + if (pressingForward == null) pressingForward = e.pressingForward; + if (pressingBack == null) pressingBack = e.pressingBack; + if (pressingLeft == null) pressingLeft = e.pressingLeft; + if (pressingRight == null) pressingRight = e.pressingRight; + if (sprinting == null) sprinting = e.sprinting; + } + + public boolean isEmpty() { + return sneaking == null && + jumping == null && + movementSideways == null && + movementForward == null && + pressingForward == null && + pressingBack == null && + pressingLeft == null && + pressingRight == null && + sprinting == null; } public void replay() { @@ -159,8 +117,8 @@ public class InputEvent extends RecordEvent { public void inputCallback() { if (Main.client.player != null) { - if (sprint != null && Main.client.player.isSprinting() != sprint) - Main.client.player.setSprinting(sprint); + if (sprinting != null && Main.client.player.isSprinting() != sprinting) + Main.client.player.setSprinting(sprinting); if (Main.client.player.getYaw() != yaw) Main.client.player.setYaw(yaw); if (Main.client.player.getHeadYaw() != head_yaw) @@ -171,25 +129,22 @@ public class InputEvent extends RecordEvent { Main.client.player.setPitch(pitch); if (Main.client.player.getMovementSpeed() != speed) Main.client.player.setMovementSpeed(speed); - - try { - Field field = Input.class.getDeclaredField("movementVector"); - field.setAccessible(true); - field.set(Main.client.player.input, new Vec2f(movementSideways, movementForward)); - } catch (NoSuchFieldException | IllegalAccessException e) { - e.printStackTrace(); - } - - PlayerInput input = Main.client.player.input.playerInput; - Main.client.player.input.playerInput = new PlayerInput( - this.forward == null ? input.forward() : this.forward, - this.backward == null ? input.backward() : this.backward, - this.left == null ? input.left() : this.left, - this.right == null ? input.right() : this.right, - this.jump == null ? input.jump() : this.jump, - this.sneak == null ? input.sneak() : this.sneak, - this.sprint == null ? input.sprint() : this.sprint - ); + if (sneaking != null && Main.client.player.input.sneaking != sneaking) + Main.client.player.input.sneaking = sneaking; + if (jumping != null && Main.client.player.input.jumping != jumping) + Main.client.player.input.jumping = jumping; + if (movementSideways != null && Main.client.player.input.movementSideways != movementSideways) + Main.client.player.input.movementSideways = movementSideways; + if (movementForward != null && Main.client.player.input.movementForward != movementForward) + Main.client.player.input.movementForward = movementForward; + if (pressingForward != null && Main.client.player.input.pressingForward != pressingForward) + Main.client.player.input.pressingForward = pressingForward; + if (pressingBack != null && Main.client.player.input.pressingBack != pressingBack) + Main.client.player.input.pressingBack = pressingBack; + if (pressingLeft != null && Main.client.player.input.pressingLeft != pressingLeft) + Main.client.player.input.pressingLeft = pressingLeft; + if (pressingRight != null && Main.client.player.input.pressingRight != pressingRight) + Main.client.player.input.pressingRight = pressingRight; } } } diff --git a/src/main/java/ru/themixray/repeating_mod/mixin/EntityMixin.java b/src/main/java/ru/themixray/repeating_mod/mixin/EntityMixin.java index 93257cc..9bf8341 100644 --- a/src/main/java/ru/themixray/repeating_mod/mixin/EntityMixin.java +++ b/src/main/java/ru/themixray/repeating_mod/mixin/EntityMixin.java @@ -20,8 +20,8 @@ public abstract class EntityMixin { if (getUuid().equals(Main.client.player.getUuid())) { if (Main.me.is_replaying) { if (Main.input_replay != null && - Main.input_replay.sprint != null && - Main.input_replay.sprint != sprinting) { + Main.input_replay.sprinting != null && + Main.input_replay.sprinting != sprinting) { ci.cancel(); } } diff --git a/src/main/java/ru/themixray/repeating_mod/mixin/InputMixin.java b/src/main/java/ru/themixray/repeating_mod/mixin/InputMixin.java index 261c59c..33acbf1 100644 --- a/src/main/java/ru/themixray/repeating_mod/mixin/InputMixin.java +++ b/src/main/java/ru/themixray/repeating_mod/mixin/InputMixin.java @@ -10,7 +10,7 @@ import ru.themixray.repeating_mod.Main; @Mixin(KeyboardInput.class) public abstract class InputMixin { @Inject(at = @At(value = "TAIL"), method = "tick") - private void onTickTail(CallbackInfo ci) { + private void onTickTail(boolean slowDown, float f, CallbackInfo ci) { if (Main.me.is_replaying) { if (Main.input_replay != null) { Main.input_replay.inputCallback(); diff --git a/src/main/java/ru/themixray/repeating_mod/render/shader/ShaderManager.java b/src/main/java/ru/themixray/repeating_mod/render/shader/ShaderManager.java index f5e26a6..34c0d25 100644 --- a/src/main/java/ru/themixray/repeating_mod/render/shader/ShaderManager.java +++ b/src/main/java/ru/themixray/repeating_mod/render/shader/ShaderManager.java @@ -1,6 +1,6 @@ package ru.themixray.repeating_mod.render.shader; -import com.mojang.blaze3d.opengl.GlStateManager; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.TextureUtil; import lombok.Getter; import lombok.SneakyThrows; @@ -51,7 +51,7 @@ public class ShaderManager { public String loadImport(boolean inline, String name) { return IOUtils.toString(resource.get().getInputStream(), StandardCharsets.UTF_8); } - }.readSource(readResourceAsString(resource.get().getInputStream())).getFirst()); + }.readSource(readResourceAsString(resource.get().getInputStream()))); } else file_present = false; glCompileShader(i); if (glGetShaderi(i, GL_COMPILE_STATUS) == 0 || !file_present) { diff --git a/src/main/java/ru/themixray/repeating_mod/widget/RecordListWidget.java b/src/main/java/ru/themixray/repeating_mod/widget/RecordListWidget.java index b17af92..5b7a7e3 100644 --- a/src/main/java/ru/themixray/repeating_mod/widget/RecordListWidget.java +++ b/src/main/java/ru/themixray/repeating_mod/widget/RecordListWidget.java @@ -26,40 +26,27 @@ public class RecordListWidget extends ScrollableWidget { return res; } - @Override - protected int getContentsHeightWithPadding() { - return !widgets.isEmpty() ? widgets.size() * 55 + (widgets.size() - 1) * 2 : 0; - } - @Override protected double getDeltaYPerScroll() { return 10; } @Override - protected void renderWidget(DrawContext ctx, int mouseX, int mouseY, float delta) { - ctx.fill(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.getHeight(), 0xff000000); - - ctx.enableScissor(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.getHeight()); - - int y = (int) -this.getScrollY(); + protected void renderContents(DrawContext ctx, int mouseX, int mouseY, float delta) { + int y = 0; for (RecordWidget wid: widgets) { wid.setY(y); - wid.render(ctx, mouseX, (int) (mouseY), delta); + wid.render(ctx, mouseX, (int) (mouseY + this.getScrollY()), delta); y += wid.getHeight(); y += 2; } - - ctx.disableScissor(); - - this.drawScrollbar(ctx); } public void addWidget(RecordState record) { - RecordWidget widget = new RecordWidget(0, 0, width - 6, 55, record, this); + RecordWidget widget = new RecordWidget(0, 0, width, 55, record, this); widget.init(null); - widgets.addFirst(widget); + widgets.add(0, widget); } public void removeWidget(RecordState record) { @@ -76,6 +63,11 @@ public class RecordListWidget extends ScrollableWidget { return focused; } + @Override + protected int getContentsHeight() { + return !widgets.isEmpty() ? widgets.size() * 55 + (widgets.size() - 1) * 2 : 0; + } + public void init(RepeatingScreen screen) { for (RecordWidget widget : widgets) { widget.init(screen); @@ -133,7 +125,7 @@ public class RecordListWidget extends ScrollableWidget { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - return checkTransportNF(mouseX, mouseY, button) || super.checkScrollbarDragged(mouseX, mouseY, button); + return checkTransportNF(mouseX, mouseY + getScrollY(), button) || super.mouseClicked(mouseX, mouseY, button); } @Override diff --git a/src/main/java/ru/themixray/repeating_mod/widget/RecordWidget.java b/src/main/java/ru/themixray/repeating_mod/widget/RecordWidget.java index 5b9954e..7d53358 100644 --- a/src/main/java/ru/themixray/repeating_mod/widget/RecordWidget.java +++ b/src/main/java/ru/themixray/repeating_mod/widget/RecordWidget.java @@ -1,6 +1,5 @@ package ru.themixray.repeating_mod.widget; -import lombok.Getter; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.tooltip.Tooltip; @@ -19,7 +18,6 @@ import java.util.List; import java.util.function.Consumer; public class RecordWidget implements Drawable, Widget { - @Getter private RecordState record; private List children; @@ -152,13 +150,22 @@ public class RecordWidget implements Drawable, Widget { children.add(replay_button); } - public void drawText(int x, int y, DrawContext ctx, List lines, int line_height, boolean shadow) { + public RecordState getRecord() { + return record; + } + + public void drawText(int x, int y, DrawContext ctx, List lines, float size, int line_height, boolean shadow) { + ctx.getMatrices().push(); + ctx.getMatrices().scale(size, size, size); + int now_y = y; for (Text line : lines) { - ctx.drawText(Main.client.textRenderer, line, x, now_y, 0xff000000 + line.getStyle().getColor().getRgb(), shadow); + ctx.drawText(Main.client.textRenderer, line, (int) (x / size), (int) (now_y / size), line.getStyle().getColor().getRgb(), shadow); now_y += line_height; } + + ctx.getMatrices().pop(); } @Override @@ -183,7 +190,7 @@ public class RecordWidget implements Drawable, Widget { .append(": ") .styled((s) -> s.withColor(0xbbbbbb)), Text.literal(record.getAuthor()).styled((s) -> s.withColor(0xffffff)) - ), + ), 1, 9, false); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 4a40393..f946362 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -29,7 +29,7 @@ "depends": { "fabricloader": ">=0.14.14", "fabric-api": "*", - "minecraft": ">=1.21.4", + "minecraft": ">=1.21", "java": ">=17" }, "suggests": {