Compare commits

..

1 Commits
master ... 1.21

Author SHA1 Message Date
f6ec316b34 set fabric mod json version
All checks were successful
Build fabric mod / build (push) Successful in 12m26s
2025-06-15 20:05:24 +03:00
11 changed files with 176 additions and 190 deletions

View File

@ -4,17 +4,17 @@ org.gradle.parallel=true
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/develop # check these on https://fabricmc.net/develop
minecraft_version=1.21.6 minecraft_version=1.21
yarn_mappings=1.21.6+build.1 yarn_mappings=1.21+build.9
loader_version=0.16.14 loader_version=0.16.14
loom_version=1.10-SNAPSHOT loom_version=1.10-SNAPSHOT
# Fabric API # Fabric API
fabric_version=0.127.0+1.21.6 fabric_version=0.102.0+1.21
# Mod Properties # Mod Properties
mod_version = 1.1.2+1.21.6 mod_version = 1.1.2+1.21
maven_group = ru.themixray maven_group = ru.themixray
archives_base_name = repeating-mod archives_base_name = repeating-mod
# Compatible with: 1.21.6 # Compatible with: 1.21, 1.21.1

View File

@ -209,14 +209,46 @@ public class Main implements ClientModInitializer {
return; return;
} }
InputEvent curr = InputEvent.current(); InputEvent l = ((InputEvent) now_record.getLastEvent("input"));
if (curr == null) return; 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 (!(e.isEmpty() &&
if (last == null) { e.yaw == l.yaw &&
recordTick(curr); e.head_yaw == l.head_yaw &&
} else if (!curr.equals(last)) { e.pitch == l.pitch &&
recordTick(curr.differs(last)); 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("[") client.player.sendMessage(Text.literal("[")
.append(Text.translatable("text.repeating-mod.name")) .append(Text.translatable("text.repeating-mod.name"))
.append("] ").formatted(Formatting.BOLD,Formatting.DARK_GRAY) .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) { public static void sendDebug(String s) {
// client.player.sendMessage(Text.literal("[DEBUG] ").append(Text.of(s)), false); client.player.sendMessage(Text.literal("[DEBUG] ").append(Text.of(s)));
// } }
} }

View File

@ -51,7 +51,7 @@ public class RepeatingScreen extends Screen {
@Override @Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) { 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) { for (RenderListener l : render_listeners) {
if (l.beforeRender()) { if (l.beforeRender()) {

View File

@ -19,7 +19,7 @@ public class BlockInteractEvent extends RecordEvent {
Double.parseDouble(a[0]), Double.parseDouble(a[0]),
Double.parseDouble(a[1]), Double.parseDouble(a[1]),
Double.parseDouble(a[2])), Double.parseDouble(a[2])),
Direction.byIndex(Integer.parseInt(a[4])), Direction.byId(Integer.parseInt(a[4])),
new BlockPos( new BlockPos(
Integer.parseInt(a[0]), Integer.parseInt(a[0]),
Integer.parseInt(a[1]), Integer.parseInt(a[1]),
@ -44,7 +44,7 @@ public class BlockInteractEvent extends RecordEvent {
String.valueOf(hitResult.getBlockPos().getY()), String.valueOf(hitResult.getBlockPos().getY()),
String.valueOf(hitResult.getBlockPos().getZ()), String.valueOf(hitResult.getBlockPos().getZ()),
(hitResult.isInsideBlock() ? "1" : "0"), (hitResult.isInsideBlock() ? "1" : "0"),
String.valueOf(hitResult.getSide().getIndex()), String.valueOf(hitResult.getSide().getId()),
hand.name() hand.name()
}; };
} }

View File

@ -1,156 +1,114 @@
package ru.themixray.repeating_mod.event.events; 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.Main;
import ru.themixray.repeating_mod.event.RecordEvent; import ru.themixray.repeating_mod.event.RecordEvent;
import java.lang.reflect.Field;
public class InputEvent extends RecordEvent { public class InputEvent extends RecordEvent {
public Boolean forward; public Boolean sneaking;
public Boolean backward; public Boolean jumping;
public Boolean left; public Boolean pressingForward;
public Boolean right; public Boolean pressingBack;
public Boolean jump; public Boolean pressingLeft;
public Boolean sneak; public Boolean pressingRight;
public Boolean sprint; public Boolean sprinting;
public Float movementSideways;
public Float movementForward;
public float yaw; public float yaw;
public float head_yaw; public float head_yaw;
public float body_yaw; public float body_yaw;
public float pitch; public float pitch;
public float speed; public float speed;
public float movementForward;
public float movementSideways;
public static InputEvent current() { public InputEvent(Boolean sneaking,
if (Main.client.player == null) return null; Boolean jumping,
return new InputEvent( Float movementSideways,
Main.client.player.input.playerInput.forward(), Float movementForward,
Main.client.player.input.playerInput.backward(), Boolean pressingForward,
Main.client.player.input.playerInput.left(), Boolean pressingBack,
Main.client.player.input.playerInput.right(), Boolean pressingLeft,
Main.client.player.input.playerInput.jump(), Boolean pressingRight,
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,
float head_yaw, float head_yaw,
float body_yaw, float body_yaw,
float head_pitch, float head_pitch,
Boolean sprinting,
float yaw, float yaw,
float speed, float speed) {
float movementForward, this.sneaking = sneaking;
float movementSideways) { this.jumping = jumping;
this.forward = forward; this.movementSideways = movementSideways;
this.backward = backward; this.movementForward = movementForward;
this.left = left; this.pressingForward = pressingForward;
this.right = right; this.pressingBack = pressingBack;
this.jump = jump; this.pressingLeft = pressingLeft;
this.sneak = sneak; this.pressingRight = pressingRight;
this.sprint = sprint;
this.head_yaw = head_yaw; this.head_yaw = head_yaw;
this.body_yaw = body_yaw; this.body_yaw = body_yaw;
this.pitch = head_pitch; this.pitch = head_pitch;
this.sprinting = sprinting;
this.yaw = yaw; this.yaw = yaw;
this.speed = speed; 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) { public static InputEvent deserialize(String[] a) {
return new InputEvent( return new InputEvent(
(a[0].equals("n") ? null : a[0].equals("1")), (a[0].equals("n") ? null : a[0].equals("1")),
(a[1].equals("n") ? null : a[1].equals("1")), (a[1].equals("n") ? null : a[1].equals("1")),
(a[2].equals("n") ? null : a[2].equals("1")), (a[2].equals("n") ? null : Float.parseFloat(a[2])),
(a[3].equals("n") ? null : a[3].equals("1")), (a[3].equals("n") ? null : Float.parseFloat(a[3])),
(a[4].equals("n") ? null : a[4].equals("1")), (a[4].equals("n") ? null : a[4].equals("1")),
(a[5].equals("n") ? null : a[5].equals("1")), (a[5].equals("n") ? null : a[5].equals("1")),
(a[6].equals("n") ? null : a[6].equals("1")), (a[6].equals("n") ? null : a[6].equals("1")),
Float.parseFloat(a[7]), (a[7].equals("n") ? null : a[7].equals("1")),
Float.parseFloat(a[8]), Float.parseFloat(a[8]), Float.parseFloat(a[9]),
Float.parseFloat(a[9]), Float.parseFloat(a[10]),
Float.parseFloat(a[10]), (a[11].equals("n") ? null : a[11].equals("1")),
Float.parseFloat(a[11]), Float.parseFloat(a[12]),
Float.parseFloat(a[12]), Float.parseFloat(a[13]));
Float.parseFloat(a[13])
);
} }
protected String[] serializeArgs() { protected String[] serializeArgs() {
return new String[] { return new String[] {
((forward == null) ? "n" : (forward ? "1" : "0")), ((sneaking == null) ? "n" : (sneaking ? "1" : "0")), // sneaking
((backward == null) ? "n" : (backward ? "1" : "0")), ((jumping == null) ? "n" : (jumping ? "1" : "0")), // jumping
((left == null) ? "n" : (left ? "1" : "0")), ((movementSideways == null) ? "n" : String.valueOf(movementSideways)), // movement sideways
((right == null) ? "n" : (right ? "1" : "0")), ((movementForward == null) ? "n" : String.valueOf(movementForward)), // movement forward
((jump == null) ? "n" : (jump ? "1" : "0")), ((pressingForward == null) ? "n" : (pressingForward ? "1" : "0")), // pressing forward
((sneak == null) ? "n" : (sneak ? "1" : "0")), ((pressingBack == null) ? "n" : (pressingBack ? "1" : "0")), // pressing back
((sprint == null) ? "n" : (sprint ? "1" : "0")), ((pressingLeft == null) ? "n" : (pressingLeft ? "1" : "0")), // pressing left
String.valueOf(head_yaw), ((pressingRight == null) ? "n" : (pressingRight ? "1" : "0")), // pressing right
String.valueOf(body_yaw), String.valueOf(head_yaw), // head yaw
String.valueOf(pitch), String.valueOf(body_yaw), // body yaw
String.valueOf(yaw), String.valueOf(pitch), // pitch
String.valueOf(speed), ((sprinting == null) ? "n" : (sprinting ? "1" : "0")), // sprinting
String.valueOf(movementForward), String.valueOf(yaw), // yaw
String.valueOf(movementSideways) String.valueOf(speed) // speed
}; };
} }
public boolean equals(InputEvent event) { public void fillEmpty(InputEvent e) {
return event.forward == forward && if (sneaking == null) sneaking = e.sneaking;
event.backward == backward && if (jumping == null) jumping = e.jumping;
event.sprint == sprint && if (movementSideways == null) movementSideways = e.movementSideways;
event.jump == jump && if (movementForward == null) movementForward = e.movementForward;
event.sneak == sneak && if (pressingForward == null) pressingForward = e.pressingForward;
event.left == left && if (pressingBack == null) pressingBack = e.pressingBack;
event.right == right && if (pressingLeft == null) pressingLeft = e.pressingLeft;
event.speed == speed && if (pressingRight == null) pressingRight = e.pressingRight;
event.head_yaw == head_yaw && if (sprinting == null) sprinting = e.sprinting;
event.body_yaw == body_yaw && }
event.yaw == yaw &&
event.pitch == pitch && public boolean isEmpty() {
event.movementForward == movementForward && return sneaking == null &&
event.movementSideways == movementSideways; jumping == null &&
movementSideways == null &&
movementForward == null &&
pressingForward == null &&
pressingBack == null &&
pressingLeft == null &&
pressingRight == null &&
sprinting == null;
} }
public void replay() { public void replay() {
@ -159,8 +117,8 @@ public class InputEvent extends RecordEvent {
public void inputCallback() { public void inputCallback() {
if (Main.client.player != null) { if (Main.client.player != null) {
if (sprint != null && Main.client.player.isSprinting() != sprint) if (sprinting != null && Main.client.player.isSprinting() != sprinting)
Main.client.player.setSprinting(sprint); Main.client.player.setSprinting(sprinting);
if (Main.client.player.getYaw() != yaw) if (Main.client.player.getYaw() != yaw)
Main.client.player.setYaw(yaw); Main.client.player.setYaw(yaw);
if (Main.client.player.getHeadYaw() != head_yaw) if (Main.client.player.getHeadYaw() != head_yaw)
@ -171,25 +129,22 @@ public class InputEvent extends RecordEvent {
Main.client.player.setPitch(pitch); Main.client.player.setPitch(pitch);
if (Main.client.player.getMovementSpeed() != speed) if (Main.client.player.getMovementSpeed() != speed)
Main.client.player.setMovementSpeed(speed); Main.client.player.setMovementSpeed(speed);
if (sneaking != null && Main.client.player.input.sneaking != sneaking)
try { Main.client.player.input.sneaking = sneaking;
Field field = Input.class.getDeclaredField("movementVector"); if (jumping != null && Main.client.player.input.jumping != jumping)
field.setAccessible(true); Main.client.player.input.jumping = jumping;
field.set(Main.client.player.input, new Vec2f(movementSideways, movementForward)); if (movementSideways != null && Main.client.player.input.movementSideways != movementSideways)
} catch (NoSuchFieldException | IllegalAccessException e) { Main.client.player.input.movementSideways = movementSideways;
e.printStackTrace(); if (movementForward != null && Main.client.player.input.movementForward != movementForward)
} Main.client.player.input.movementForward = movementForward;
if (pressingForward != null && Main.client.player.input.pressingForward != pressingForward)
PlayerInput input = Main.client.player.input.playerInput; Main.client.player.input.pressingForward = pressingForward;
Main.client.player.input.playerInput = new PlayerInput( if (pressingBack != null && Main.client.player.input.pressingBack != pressingBack)
this.forward == null ? input.forward() : this.forward, Main.client.player.input.pressingBack = pressingBack;
this.backward == null ? input.backward() : this.backward, if (pressingLeft != null && Main.client.player.input.pressingLeft != pressingLeft)
this.left == null ? input.left() : this.left, Main.client.player.input.pressingLeft = pressingLeft;
this.right == null ? input.right() : this.right, if (pressingRight != null && Main.client.player.input.pressingRight != pressingRight)
this.jump == null ? input.jump() : this.jump, Main.client.player.input.pressingRight = pressingRight;
this.sneak == null ? input.sneak() : this.sneak,
this.sprint == null ? input.sprint() : this.sprint
);
} }
} }
} }

View File

@ -20,8 +20,8 @@ public abstract class EntityMixin {
if (getUuid().equals(Main.client.player.getUuid())) { if (getUuid().equals(Main.client.player.getUuid())) {
if (Main.me.is_replaying) { if (Main.me.is_replaying) {
if (Main.input_replay != null && if (Main.input_replay != null &&
Main.input_replay.sprint != null && Main.input_replay.sprinting != null &&
Main.input_replay.sprint != sprinting) { Main.input_replay.sprinting != sprinting) {
ci.cancel(); ci.cancel();
} }
} }

View File

@ -10,7 +10,7 @@ import ru.themixray.repeating_mod.Main;
@Mixin(KeyboardInput.class) @Mixin(KeyboardInput.class)
public abstract class InputMixin { public abstract class InputMixin {
@Inject(at = @At(value = "TAIL"), method = "tick") @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.me.is_replaying) {
if (Main.input_replay != null) { if (Main.input_replay != null) {
Main.input_replay.inputCallback(); Main.input_replay.inputCallback();

View File

@ -1,6 +1,6 @@
package ru.themixray.repeating_mod.render.shader; 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 com.mojang.blaze3d.platform.TextureUtil;
import lombok.Getter; import lombok.Getter;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@ -51,7 +51,7 @@ public class ShaderManager {
public String loadImport(boolean inline, String name) { public String loadImport(boolean inline, String name) {
return IOUtils.toString(resource.get().getInputStream(), StandardCharsets.UTF_8); return IOUtils.toString(resource.get().getInputStream(), StandardCharsets.UTF_8);
} }
}.readSource(readResourceAsString(resource.get().getInputStream())).getFirst()); }.readSource(readResourceAsString(resource.get().getInputStream())));
} else file_present = false; } else file_present = false;
glCompileShader(i); glCompileShader(i);
if (glGetShaderi(i, GL_COMPILE_STATUS) == 0 || !file_present) { if (glGetShaderi(i, GL_COMPILE_STATUS) == 0 || !file_present) {

View File

@ -26,40 +26,27 @@ public class RecordListWidget extends ScrollableWidget {
return res; return res;
} }
@Override
protected int getContentsHeightWithPadding() {
return !widgets.isEmpty() ? widgets.size() * 55 + (widgets.size() - 1) * 2 : 0;
}
@Override @Override
protected double getDeltaYPerScroll() { protected double getDeltaYPerScroll() {
return 10; return 10;
} }
@Override @Override
protected void renderWidget(DrawContext ctx, int mouseX, int mouseY, float delta) { protected void renderContents(DrawContext ctx, int mouseX, int mouseY, float delta) {
ctx.fill(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.getHeight(), 0xff000000); int y = 0;
ctx.enableScissor(this.getX(), this.getY(), this.getX() + this.getWidth(), this.getY() + this.getHeight());
int y = (int) -this.getScrollY();
for (RecordWidget wid: widgets) { for (RecordWidget wid: widgets) {
wid.setY(y); wid.setY(y);
wid.render(ctx, mouseX, (int) (mouseY), delta); wid.render(ctx, mouseX, (int) (mouseY + this.getScrollY()), delta);
y += wid.getHeight(); y += wid.getHeight();
y += 2; y += 2;
} }
ctx.disableScissor();
this.drawScrollbar(ctx);
} }
public void addWidget(RecordState record) { 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); widget.init(null);
widgets.addFirst(widget); widgets.add(0, widget);
} }
public void removeWidget(RecordState record) { public void removeWidget(RecordState record) {
@ -76,6 +63,11 @@ public class RecordListWidget extends ScrollableWidget {
return focused; return focused;
} }
@Override
protected int getContentsHeight() {
return !widgets.isEmpty() ? widgets.size() * 55 + (widgets.size() - 1) * 2 : 0;
}
public void init(RepeatingScreen screen) { public void init(RepeatingScreen screen) {
for (RecordWidget widget : widgets) { for (RecordWidget widget : widgets) {
widget.init(screen); widget.init(screen);
@ -133,7 +125,7 @@ public class RecordListWidget extends ScrollableWidget {
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int button) { 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 @Override

View File

@ -1,6 +1,5 @@
package ru.themixray.repeating_mod.widget; package ru.themixray.repeating_mod.widget;
import lombok.Getter;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.Drawable;
import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.tooltip.Tooltip;
@ -19,7 +18,6 @@ import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
public class RecordWidget implements Drawable, Widget { public class RecordWidget implements Drawable, Widget {
@Getter
private RecordState record; private RecordState record;
private List<ClickableWidget> children; private List<ClickableWidget> children;
@ -152,13 +150,22 @@ public class RecordWidget implements Drawable, Widget {
children.add(replay_button); children.add(replay_button);
} }
public void drawText(int x, int y, DrawContext ctx, List<Text> lines, int line_height, boolean shadow) { public RecordState getRecord() {
return record;
}
public void drawText(int x, int y, DrawContext ctx, List<Text> lines, float size, int line_height, boolean shadow) {
ctx.getMatrices().push();
ctx.getMatrices().scale(size, size, size);
int now_y = y; int now_y = y;
for (Text line : lines) { 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; now_y += line_height;
} }
ctx.getMatrices().pop();
} }
@Override @Override
@ -183,7 +190,7 @@ public class RecordWidget implements Drawable, Widget {
.append(": ") .append(": ")
.styled((s) -> s.withColor(0xbbbbbb)), .styled((s) -> s.withColor(0xbbbbbb)),
Text.literal(record.getAuthor()).styled((s) -> s.withColor(0xffffff)) Text.literal(record.getAuthor()).styled((s) -> s.withColor(0xffffff))
), ), 1,
9, 9,
false); false);

View File

@ -29,7 +29,7 @@
"depends": { "depends": {
"fabricloader": ">=0.14.14", "fabricloader": ">=0.14.14",
"fabric-api": "*", "fabric-api": "*",
"minecraft": ">=1.21.4", "minecraft": ">=1.21",
"java": ">=17" "java": ">=17"
}, },
"suggests": { "suggests": {