From 9e06ea39f55f1e6c43d4bbc880511e0d4c13acd9 Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sun, 23 Mar 2025 16:18:34 +0800 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20=E4=BA=8B=E4=BB=B6=EF=BC=9AHUD=20?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E5=89=8D=20feat:=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=87=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sinobrush/client/FanRenderer.java | 156 ++++++++++++++++++ .../sinobrush/gui/screen/FanScreen.java | 70 ++------ .../sinobrush/handler/RenderHandlers.java | 4 +- .../fabric/mixin/client/GuiMixin.java | 22 +++ .../resources/sinocore-fabric.mixins.json | 3 +- .../eventhandler/ScreenEventHandler.java | 16 ++ .../sinocore/event/client/RenderEvents.java | 3 + .../args/render/BeforeRenderHudArgs.java | 7 + 8 files changed, 219 insertions(+), 62 deletions(-) create mode 100644 sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java create mode 100644 sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/mixin/client/GuiMixin.java create mode 100644 sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java create mode 100644 sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/BeforeRenderHudArgs.java diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java new file mode 100644 index 00000000..2720d6a7 --- /dev/null +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java @@ -0,0 +1,156 @@ +package games.moegirl.sinocraft.sinobrush.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import games.moegirl.sinocraft.sinobrush.item.FanItem; +import games.moegirl.sinocraft.sinobrush.item.SBRItems; +import games.moegirl.sinocraft.sinocore.gui.widgets.WidgetLoader; +import games.moegirl.sinocraft.sinocore.gui.widgets.Widgets; +import games.moegirl.sinocraft.sinocore.gui.widgets.entry.TextureEntry; +import net.minecraft.Util; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import org.joml.Matrix4f; + +import java.util.List; + +public class FanRenderer { + public static final int MAX_DISPLAY_LINES = 21; + + public static final Widgets TEXTURE = WidgetLoader.loadWidgets(ResourceLocation.parse("sinobrush:textures/gui/fan")); + public static final float[] LINE_X = {231, 223, 213, 203, 191, 181, 165, 152, 138, 117, 102, 89, 77, 67, 56, 46, 37, 28, 20, 14, 9,}; + public static final float[] LINE_Y = {64, 54, 43, 35, 27, 22, 17, 13, 10, 11, 13, 18, 22, 28, 34, 43, 52, 62, 72, 83, 95,}; + public static final float[] LINE_R = {45, 41, 35, 30, 25, 22, 14, 9, 4, -6, -13, -19, -23, -26, -30, -35, -39, -45, -50, -55, -58,}; + + public static void renderInGui(GuiGraphics guiGraphics, Font font, int x, int y, + List lines, int currentLine, long focusedTime) { +// guiGraphics.fill(x, y, x + width, y + height, ColorHelper.rgbToARGB(drawing.getPaperColor())); +// +// var pW = width / Math.max(1, drawing.getWidth()); +// var pH = height / Math.max(1, drawing.getHeight()); +// if (!drawing.isEmpty()) { +// try (var ignored = GLSwitcher.blend().enable()) { +// for (var i = 0; i < drawing.getWidth(); i++) { +// for (var j = 0; j < drawing.getHeight(); j++) { +// var pX = x + (i * pW); +// var pY = y + (j * pH); +// var color = drawing.getPixel(i, j); +// fillGuiRect(guiGraphics, pX, pY, pX + pW, pY + pH, ColorHelper.pixelColorToARGB(color, drawing.getInkColor())); +// } +// } +// } +// } + TextureEntry background = (TextureEntry) TEXTURE.getWidget("background"); + guiGraphics.blit(TEXTURE.getTexture(), x, y, + background.getWidth(), background.getHeight(), + background.getTextureX(), background.getTextureY(), + background.getTextureWidth(), background.getTextureHeight(), + TEXTURE.getWidth(), TEXTURE.getHeight()); + PoseStack pose = guiGraphics.pose(); + for (int i = 0; i < MAX_DISPLAY_LINES; i++) { + if (i >= lines.size() && currentLine != i) + continue; + + float offX = x + LINE_X[i]; + float offY = y + LINE_Y[i]; + float r = (float) Math.toRadians(LINE_R[i]); + pose.pushPose(); + pose.translate(offX, offY, 0); + pose.scale(0.6f, 0.6f, 1); + pose.mulPose(new Matrix4f().rotate(r, 0, 0, 1)); + int ny = 0; + // 文本内容 + if (i < lines.size()) { + ny = drawCharacters(guiGraphics, font, lines.get(i).getString()); + } + // 编辑标记 + if (currentLine == i && (Util.getMillis() - focusedTime) / 300L % 2L == 0L) { + guiGraphics.drawString(font, "_", 0, ny, 0x414141); + } + pose.translate(-offX, -offY, 0); + pose.popPose(); + } + } + + private static int drawCharacters(GuiGraphics guiGraphics, Font font, String line) { + int y = 0; + for (char c : line.toCharArray()) { + String s = String.valueOf(c); + int w = font.width(s); + int h = font.wordWrapHeight(s, w); + guiGraphics.drawString(font, s, 0, y, 0x414141, false); + y += h; + } + return y; + } + + public static void renderInHud(GuiGraphics guiGraphics, DeltaTracker partialTick) { + LocalPlayer player = Minecraft.getInstance().player; + if (player != null) { + ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); + if (stack.is(SBRItems.FAN.get())) { + renderInHud(guiGraphics, partialTick, stack); + return; + } + + stack = player.getItemInHand(InteractionHand.OFF_HAND); + if (stack.is(SBRItems.FAN.get())) { + renderInHud(guiGraphics, partialTick, stack); + return; + } + + Inventory inventory = player.getInventory(); + for (int i = 0; i < 9; i++) { + stack = inventory.getItem(i); + if (stack.is(SBRItems.FAN.get())) { + renderInHud(guiGraphics, partialTick, stack); + return; + } + } + } + } + + private static void renderInHud(GuiGraphics guiGraphics, DeltaTracker partialTick, ItemStack stack) { + List lines = FanItem.getLines(stack); + PoseStack pose = guiGraphics.pose(); + pose.pushPose(); + pose.scale(0.5f, 0.5f, 1); + renderInGui(guiGraphics, Minecraft.getInstance().font, 0, 0, lines, -1, 0); + pose.popPose(); + } + + private static int getLightVal(ItemFrame itemFrame, int glowLightVal, int regularLightVal) { + return itemFrame.getType() == EntityType.GLOW_ITEM_FRAME ? glowLightVal : regularLightVal; + } + + private static void fillGuiRect(GuiGraphics guiGraphics, float minX, float minY, float maxX, float maxY, int color) { + var matrix4f = guiGraphics.pose().last().pose(); + var buffer = guiGraphics.bufferSource().getBuffer(RenderType.guiOverlay()); + buffer.addVertex(matrix4f, minX, minY, 0).setColor(color); + buffer.addVertex(matrix4f, minX, maxY, 0).setColor(color); + buffer.addVertex(matrix4f, maxX, maxY, 0).setColor(color); + buffer.addVertex(matrix4f, maxX, minY, 0).setColor(color); + guiGraphics.flush(); + } + + private static void fillRect(PoseStack poseStack, VertexConsumer buffer, + float minX, float minY, float maxX, float maxY, + float zIndex, + int color, int combinedLight) { + buffer.addVertex(poseStack.last().pose(), minX, minY, zIndex).setColor(color).setLight(combinedLight); + buffer.addVertex(poseStack.last().pose(), minX, maxY, zIndex).setColor(color).setLight(combinedLight); + buffer.addVertex(poseStack.last().pose(), maxX, maxY, zIndex).setColor(color).setLight(combinedLight); + buffer.addVertex(poseStack.last().pose(), maxX, minY, zIndex).setColor(color).setLight(combinedLight); + } +} diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java index 3a58c4d7..a2a26138 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java @@ -1,30 +1,22 @@ package games.moegirl.sinocraft.sinobrush.gui.screen; -import com.mojang.blaze3d.vertex.PoseStack; +import games.moegirl.sinocraft.sinobrush.client.FanRenderer; import games.moegirl.sinocraft.sinobrush.network.Common2FanLines; -import games.moegirl.sinocraft.sinocore.gui.widgets.WidgetLoader; -import games.moegirl.sinocraft.sinocore.gui.widgets.Widgets; import games.moegirl.sinocraft.sinocore.gui.widgets.entry.TextureEntry; import games.moegirl.sinocraft.sinocore.network.NetworkManager; import net.minecraft.Util; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.InteractionHand; -import org.joml.Matrix4f; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; import java.util.List; -public class FanScreen extends Screen { - public static final int MAX_DISPLAY_LINES = 21; +import static games.moegirl.sinocraft.sinobrush.client.FanRenderer.MAX_DISPLAY_LINES; +import static games.moegirl.sinocraft.sinobrush.client.FanRenderer.TEXTURE; - public static final Widgets TEXTURE = WidgetLoader.loadWidgets(ResourceLocation.parse("sinobrush:textures/gui/fan")); - public static final float[] LINE_X = {231, 223, 213, 203, 191, 181, 165, 152, 138, 117, 102, 89, 77, 67, 56, 46, 37, 28, 20, 14, 9,}; - public static final float[] LINE_Y = {64, 54, 43, 35, 27, 22, 17, 13, 10, 11, 13, 18, 22, 28, 34, 43, 52, 62, 72, 83, 95,}; - public static final float[] LINE_R = {45, 41, 35, 30, 25, 22, 14, 9, 4, -6, -13, -19, -23, -26, -30, -35, -39, -45, -50, -55, -58,}; +public class FanScreen extends Screen { private int leftPos, topPos; private final int imageWidth, imageHeight; @@ -49,59 +41,17 @@ protected void init() { @Override protected void renderMenuBackground(GuiGraphics guiGraphics, int x, int y, int width, int height) { - TextureEntry background = (TextureEntry) TEXTURE.getWidget("background"); - guiGraphics.blit(TEXTURE.getTexture(), leftPos + x, topPos + y, imageWidth, imageHeight, - background.getTextureX(), background.getTextureY(), - background.getTextureWidth(), background.getTextureHeight(), - TEXTURE.getWidth(), TEXTURE.getHeight()); +// TextureEntry background = (TextureEntry) TEXTURE.getWidget("background"); +// guiGraphics.blit(TEXTURE.getTexture(), leftPos + x, topPos + y, imageWidth, imageHeight, +// background.getTextureX(), background.getTextureY(), +// background.getTextureWidth(), background.getTextureHeight(), +// TEXTURE.getWidth(), TEXTURE.getHeight()); } @Override public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { super.render(guiGraphics, mouseX, mouseY, partialTick); - PoseStack pose = guiGraphics.pose(); - for (int i = 0; i < MAX_DISPLAY_LINES; i++) { - if (i >= lines.size() && currentLine != i) - continue; - - float x = leftPos + LINE_X[i]; - float y = topPos + LINE_Y[i]; - float r = (float) Math.toRadians(LINE_R[i]); - pose.pushPose(); - pose.translate(x, y, 0); - pose.scale(0.6f, 0.6f, 1); - pose.mulPose(new Matrix4f().rotate(r, 0, 0, 1)); - int ny = 0; - // 文本内容 - if (i < lines.size()) { - ny = drawCharacters(guiGraphics, lines.get(i).getString()); - } - // 编辑标记 - if (currentLine == i) { - drawAppendChar(guiGraphics, ny); - } - pose.translate(-x, -y, 0); - pose.popPose(); - } - } - - private int drawCharacters(GuiGraphics guiGraphics, String line) { - int y = 0; - for (char c : line.toCharArray()) { - String s = String.valueOf(c); - int w = font.width(s); - int h = font.wordWrapHeight(s, w); - guiGraphics.drawString(font, s, 0, y, 0x414141, false); - y += h; - } - return y; - } - - private void drawAppendChar(GuiGraphics guiGraphics, int y) { - boolean show = (Util.getMillis() - focusedTime) / 300L % 2L == 0L; - if (show) { - guiGraphics.drawString(this.font, "_", 0, y, 0x414141); - } + FanRenderer.renderInGui(guiGraphics, font, leftPos, topPos, lines, currentLine, focusedTime); } @Override diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java index b454ce2f..5846d69a 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java @@ -1,7 +1,7 @@ package games.moegirl.sinocraft.sinobrush.handler; import games.moegirl.sinocraft.sinobrush.client.DrawingRenderer; -import games.moegirl.sinocraft.sinobrush.item.FilledXuanPaperItem; +import games.moegirl.sinocraft.sinobrush.client.FanRenderer; import games.moegirl.sinocraft.sinobrush.item.SBRItems; import games.moegirl.sinocraft.sinobrush.item.component.Drawing; import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; @@ -20,5 +20,7 @@ public static void register() { args.cancel(); } }); + + RenderEvents.BEFORE_RENDER_HUD.register(args -> FanRenderer.renderInHud(args.guiGraphics(), args.partialTick())); } } diff --git a/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/mixin/client/GuiMixin.java b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/mixin/client/GuiMixin.java new file mode 100644 index 00000000..be6e528d --- /dev/null +++ b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/mixin/client/GuiMixin.java @@ -0,0 +1,22 @@ +package games.moegirl.sinocraft.sinocore.fabric.mixin.client; + +import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; +import games.moegirl.sinocraft.sinocore.event.client.args.render.BeforeRenderHudArgs; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiGraphics; +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; + +@Mixin(Gui.class) +public abstract class GuiMixin { + + @Inject(method = "render", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/gui/LayeredDraw;render(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/DeltaTracker;)V")) + public void beforeRender(GuiGraphics guiGraphics, DeltaTracker deltaTracker, CallbackInfo ci) { + RenderEvents.BEFORE_RENDER_HUD.invoke(new BeforeRenderHudArgs(guiGraphics, deltaTracker)); + } +} diff --git a/sinocore/sinocore-fabric/src/main/resources/sinocore-fabric.mixins.json b/sinocore/sinocore-fabric/src/main/resources/sinocore-fabric.mixins.json index 745b6973..a0331a97 100644 --- a/sinocore/sinocore-fabric/src/main/resources/sinocore-fabric.mixins.json +++ b/sinocore/sinocore-fabric/src/main/resources/sinocore-fabric.mixins.json @@ -7,7 +7,8 @@ ], "client": [ "client.ItemMixin_Fabric_Client", - "event.client.render.ItemFrameRendererMixin" + "event.client.render.ItemFrameRendererMixin", + "client.GuiMixin" ], "server": [ ], diff --git a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java new file mode 100644 index 00000000..1022d08b --- /dev/null +++ b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java @@ -0,0 +1,16 @@ +package games.moegirl.sinocraft.sinocore.neoforge.eventhandler; + +import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; +import games.moegirl.sinocraft.sinocore.event.client.args.render.BeforeRenderHudArgs; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.RenderGuiEvent; + +@EventBusSubscriber +public class ScreenEventHandler { + + @SubscribeEvent + public static void onGuiRender(RenderGuiEvent.Pre event) { + RenderEvents.BEFORE_RENDER_HUD.invoke(new BeforeRenderHudArgs(event.getGuiGraphics(), event.getPartialTick())); + } +} diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java index d88394be..89263cd4 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java @@ -3,9 +3,12 @@ import games.moegirl.sinocraft.sinocore.event.EventFactory; import games.moegirl.sinocraft.sinocore.event.ICancellableEventHandler; import games.moegirl.sinocraft.sinocore.event.IEvent; +import games.moegirl.sinocraft.sinocore.event.IEventHandler; +import games.moegirl.sinocraft.sinocore.event.client.args.render.BeforeRenderHudArgs; import games.moegirl.sinocraft.sinocore.event.client.args.render.RenderItemInFrameArgs; public class RenderEvents { public static final IEvent> RENDER_ITEM_IN_FRAME = EventFactory.createCancellableEvent(RenderItemInFrameArgs.class); + public static final IEvent> BEFORE_RENDER_HUD = EventFactory.createEvent(BeforeRenderHudArgs.class); } diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/BeforeRenderHudArgs.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/BeforeRenderHudArgs.java new file mode 100644 index 00000000..52db1db7 --- /dev/null +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/BeforeRenderHudArgs.java @@ -0,0 +1,7 @@ +package games.moegirl.sinocraft.sinocore.event.client.args.render; + +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.gui.GuiGraphics; + +public record BeforeRenderHudArgs(GuiGraphics guiGraphics, DeltaTracker partialTick) { +} From c003be52b798321b279ef84e9ac94c9c81436d85 Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sun, 23 Mar 2025 16:27:41 +0800 Subject: [PATCH 02/13] =?UTF-8?q?fix:=20=E5=85=89=E6=A0=87=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sinobrush/gui/screen/FanScreen.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java index a2a26138..48317617 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java @@ -39,21 +39,24 @@ protected void init() { this.topPos = (this.height - this.imageHeight) / 2; } - @Override - protected void renderMenuBackground(GuiGraphics guiGraphics, int x, int y, int width, int height) { -// TextureEntry background = (TextureEntry) TEXTURE.getWidget("background"); -// guiGraphics.blit(TEXTURE.getTexture(), leftPos + x, topPos + y, imageWidth, imageHeight, -// background.getTextureX(), background.getTextureY(), -// background.getTextureWidth(), background.getTextureHeight(), -// TEXTURE.getWidth(), TEXTURE.getHeight()); - } - @Override public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { super.render(guiGraphics, mouseX, mouseY, partialTick); FanRenderer.renderInGui(guiGraphics, font, leftPos, topPos, lines, currentLine, focusedTime); } + private void moveCursorLeft() { + if (currentLine != -1) { + currentLine = (currentLine + 1) % MAX_DISPLAY_LINES; + } + } + + private void moveCursorRight() { + if (currentLine != -1) { + currentLine = (MAX_DISPLAY_LINES + currentLine - 1) % MAX_DISPLAY_LINES; + } + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (mouseX >= leftPos && mouseX < leftPos + imageWidth && mouseY >= topPos && mouseY < topPos + imageHeight) { @@ -69,11 +72,16 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == GLFW.GLFW_KEY_LEFT || keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER) { - currentLine = (currentLine + 1) % MAX_DISPLAY_LINES; + if (keyCode == GLFW.GLFW_KEY_LEFT) { + moveCursorLeft(); + return true; + } else if (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER) { + if (currentLine != MAX_DISPLAY_LINES - 1) { + moveCursorLeft(); + } return true; } else if (keyCode == GLFW.GLFW_KEY_RIGHT) { - currentLine = (MAX_DISPLAY_LINES + currentLine - 1) % MAX_DISPLAY_LINES; + moveCursorRight(); return true; } else if (keyCode == GLFW.GLFW_KEY_BACKSPACE && currentLine != -1) { Component component = getComponentAt(currentLine); @@ -81,6 +89,8 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (!content.isEmpty()) { lines.set(currentLine, Component.literal(content.substring(0, content.length() - 1))); isChanged = true; + } else if (currentLine > 0){ + moveCursorRight(); } return true; } @@ -91,7 +101,9 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { public boolean charTyped(char codePoint, int modifiers) { if (currentLine >= 0) { if (codePoint == '\n') { - currentLine = (currentLine + 1) % MAX_DISPLAY_LINES; + if (currentLine != MAX_DISPLAY_LINES - 1) { + moveCursorLeft(); + } } else { Component component = getComponentAt(currentLine); lines.set(currentLine, Component.literal(component.getString() + codePoint)); From 0d9dd66cdb8552ea240c61a6dcb48146448c2b74 Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sun, 23 Mar 2025 16:28:10 +0800 Subject: [PATCH 03/13] clean codes --- .../sinobrush/client/FanRenderer.java | 44 ------------------- 1 file changed, 44 deletions(-) diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java index 2720d6a7..ab8d3c1f 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java @@ -1,7 +1,6 @@ package games.moegirl.sinocraft.sinobrush.client; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import games.moegirl.sinocraft.sinobrush.item.FanItem; import games.moegirl.sinocraft.sinobrush.item.SBRItems; import games.moegirl.sinocraft.sinocore.gui.widgets.WidgetLoader; @@ -13,12 +12,9 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; import org.joml.Matrix4f; @@ -35,22 +31,6 @@ public class FanRenderer { public static void renderInGui(GuiGraphics guiGraphics, Font font, int x, int y, List lines, int currentLine, long focusedTime) { -// guiGraphics.fill(x, y, x + width, y + height, ColorHelper.rgbToARGB(drawing.getPaperColor())); -// -// var pW = width / Math.max(1, drawing.getWidth()); -// var pH = height / Math.max(1, drawing.getHeight()); -// if (!drawing.isEmpty()) { -// try (var ignored = GLSwitcher.blend().enable()) { -// for (var i = 0; i < drawing.getWidth(); i++) { -// for (var j = 0; j < drawing.getHeight(); j++) { -// var pX = x + (i * pW); -// var pY = y + (j * pH); -// var color = drawing.getPixel(i, j); -// fillGuiRect(guiGraphics, pX, pY, pX + pW, pY + pH, ColorHelper.pixelColorToARGB(color, drawing.getInkColor())); -// } -// } -// } -// } TextureEntry background = (TextureEntry) TEXTURE.getWidget("background"); guiGraphics.blit(TEXTURE.getTexture(), x, y, background.getWidth(), background.getHeight(), @@ -129,28 +109,4 @@ private static void renderInHud(GuiGraphics guiGraphics, DeltaTracker partialTic renderInGui(guiGraphics, Minecraft.getInstance().font, 0, 0, lines, -1, 0); pose.popPose(); } - - private static int getLightVal(ItemFrame itemFrame, int glowLightVal, int regularLightVal) { - return itemFrame.getType() == EntityType.GLOW_ITEM_FRAME ? glowLightVal : regularLightVal; - } - - private static void fillGuiRect(GuiGraphics guiGraphics, float minX, float minY, float maxX, float maxY, int color) { - var matrix4f = guiGraphics.pose().last().pose(); - var buffer = guiGraphics.bufferSource().getBuffer(RenderType.guiOverlay()); - buffer.addVertex(matrix4f, minX, minY, 0).setColor(color); - buffer.addVertex(matrix4f, minX, maxY, 0).setColor(color); - buffer.addVertex(matrix4f, maxX, maxY, 0).setColor(color); - buffer.addVertex(matrix4f, maxX, minY, 0).setColor(color); - guiGraphics.flush(); - } - - private static void fillRect(PoseStack poseStack, VertexConsumer buffer, - float minX, float minY, float maxX, float maxY, - float zIndex, - int color, int combinedLight) { - buffer.addVertex(poseStack.last().pose(), minX, minY, zIndex).setColor(color).setLight(combinedLight); - buffer.addVertex(poseStack.last().pose(), minX, maxY, zIndex).setColor(color).setLight(combinedLight); - buffer.addVertex(poseStack.last().pose(), maxX, maxY, zIndex).setColor(color).setLight(combinedLight); - buffer.addVertex(poseStack.last().pose(), maxX, minY, zIndex).setColor(color).setLight(combinedLight); - } } From 7705f0f7273e6c75aa13786c6e98afee7438ea4a Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sun, 23 Mar 2025 23:53:00 +0800 Subject: [PATCH 04/13] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E5=A0=86=20todo=20feat:=20=E8=AE=BE=E7=BD=AE=E6=89=87?= =?UTF-8?q?=E5=AD=90=20HUD=20=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0ef3df785a7f94cfbffdf71a30a0892f6d385df3 | 4 +- .../a8fcf7feab4b002651f8845bb8733436a9644e8d | 4 +- .../c9e6904cd53920642cfd601a942b3aed84069064 | 4 +- .../ed04c204adf5a1b37ba6904801511276adad4ec4 | 4 +- .../assets/sinobrush/lang/en_us.json | 2 + .../assets/sinobrush/lang/zh_cn.json | 2 + .../assets/sinobrush/lang/zh_hk.json | 2 + .../assets/sinobrush/lang/zh_tw.json | 2 + .../sinocraft/sinobrush/SBRConstants.java | 2 + .../sinocraft/sinobrush/SinoBrush.java | 2 + .../sinobrush/client/FanRenderer.java | 30 ++++-- .../data/gen/lang/EnUsLangProvider.java | 2 + .../data/gen/lang/ZhCnLangProvider.java | 2 + .../data/gen/lang/ZhHkLangProvider.java | 2 + .../data/gen/lang/ZhTwLangProvider.java | 2 + .../sinobrush/gui/screen/FanScreen.java | 95 ++++++++++++++++++- .../sinobrush/handler/RenderHandlers.java | 2 +- .../sinocraft/sinobrush/item/FanItem.java | 8 ++ .../sinocore/fabric/SinoCorePlatformImpl.java | 5 + .../neoforge/SinoCorePlatformImpl.java | 7 ++ .../sinocraft/sinocore/SinoCorePlatform.java | 28 ++++++ .../sinocore/utility/config/ConfigPack.java | 44 +++++++++ .../sinocore/utility/config/Configs.java | 52 ++++++++++ .../utility/config/IConfigVisitor.java | 21 ++++ .../sinocore/utility/config/JsonVisitor.java | 73 ++++++++++++++ 25 files changed, 382 insertions(+), 19 deletions(-) create mode 100644 sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/ConfigPack.java create mode 100644 sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java create mode 100644 sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java create mode 100644 sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java diff --git a/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 b/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 index bee29450..2353385d 100644 --- a/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 +++ b/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 @@ -1,2 +1,2 @@ -// 1.21.1 2025-02-09T20:04:55.8755727 Languages: zh_cn for mod: sinobrush -6703a6ffc6e71681f6d65c55cb784e22cb94850f assets/sinobrush/lang/zh_cn.json +// 1.21.1 2025-03-23T23:28:49.339672 Languages: zh_cn for mod: sinobrush +ff76142d7cf84eebe1cba9d66b65a1222bb23d52 assets/sinobrush/lang/zh_cn.json diff --git a/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d b/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d index 33bc956b..31267e55 100644 --- a/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d +++ b/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d @@ -1,2 +1,2 @@ -// 1.21.1 2025-02-09T20:04:55.8755727 Languages: zh_hk for mod: sinobrush -f3ff30daf5943879fc1a4304e7e4b7ac07684e89 assets/sinobrush/lang/zh_hk.json +// 1.21.1 2025-03-23T23:31:50.2687605 Languages: zh_hk for mod: sinobrush +450ddb8544e1113c258818d8cc5f0c39227d9f83 assets/sinobrush/lang/zh_hk.json diff --git a/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 b/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 index 9e25e262..25ef5b77 100644 --- a/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 +++ b/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 @@ -1,2 +1,2 @@ -// 1.21.1 2025-02-09T20:04:55.8755727 Languages: en_us for mod: sinobrush -65cd216d17e9e5917d0fafad74b16723c52b622a assets/sinobrush/lang/en_us.json +// 1.21.1 2025-03-23T23:28:49.3420868 Languages: en_us for mod: sinobrush +4eaec36d4e07cb37c4656632f34595c3e68871d5 assets/sinobrush/lang/en_us.json diff --git a/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 b/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 index a87ef963..492654cb 100644 --- a/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 +++ b/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 @@ -1,2 +1,2 @@ -// 1.21.1 2025-02-09T20:04:55.8710529 Languages: zh_tw for mod: sinobrush -3b79d66cd21b4c4e859c0b2bbdf380ff563ce216 assets/sinobrush/lang/zh_tw.json +// 1.21.1 2025-03-23T23:31:50.2657454 Languages: zh_tw for mod: sinobrush +9773427b30c8a0f1fbfee385d588a621464a7df3 assets/sinobrush/lang/zh_tw.json diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json index ef22ca80..312dcbac 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json @@ -39,6 +39,8 @@ "sinobrush.gui.brush.tooltip_clear": "Clear the canvas", "sinobrush.gui.brush.tooltip_copy": "Left click to copy, right click to paste", "sinobrush.gui.brush.tooltip_save": "Save the canvas to an image", + "sinobrush.gui.fan.setting_hud_hint": "Drag to set position, scroll to set size.", + "sinobrush.gui.fan.setting_hud_position": "Setting HUD position", "stat.sinobrush.draw_by_brush": "Times of writing with brush", "stat.sinobrush.unfold_fan": "Times of unfolding the fan", "tag.item.sinobrush.fan": "Folding Fan", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json index 6758d9de..6a045694 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json @@ -39,6 +39,8 @@ "sinobrush.gui.brush.tooltip_clear": "清空画布", "sinobrush.gui.brush.tooltip_copy": "左键复制,右键粘贴", "sinobrush.gui.brush.tooltip_save": "保存画布为图片", + "sinobrush.gui.fan.setting_hud_hint": "拖动调整位置,滚动滚轮调整大小", + "sinobrush.gui.fan.setting_hud_position": "设置 HUD 位置", "stat.sinobrush.draw_by_brush": "作画次数", "stat.sinobrush.unfold_fan": "展开折扇次数", "tag.item.sinobrush.fan": "折扇", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json index d4bbfd23..a0bc9a59 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json @@ -39,6 +39,8 @@ "sinobrush.gui.brush.tooltip_clear": "清空畫布", "sinobrush.gui.brush.tooltip_copy": "左鍵複製,右鍵黏貼", "sinobrush.gui.brush.tooltip_save": "保存畫布為圖片", + "sinobrush.gui.fan.setting_hud_hint": "拖動調整位置,滾動滾輪調整大小", + "sinobrush.gui.fan.setting_hud_position": "設定 HUD 位置", "stat.sinobrush.draw_by_brush": "作畫次數", "stat.sinobrush.unfold_fan": "展開摺扇次數", "tag.item.sinobrush.fan": "摺扇", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json index 1b2fb4c9..f3eead03 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json @@ -39,6 +39,8 @@ "sinobrush.gui.brush.tooltip_clear": "清空畫布", "sinobrush.gui.brush.tooltip_copy": "左鍵複製,右鍵黏貼", "sinobrush.gui.brush.tooltip_save": "保存畫布為圖片", + "sinobrush.gui.fan.setting_hud_hint": "拖動調整位置,滾動滾輪調整大小", + "sinobrush.gui.fan.setting_hud_position": "設定 HUD 位置", "stat.sinobrush.draw_by_brush": "作畫次數", "stat.sinobrush.unfold_fan": "展開摺扇次數", "tag.item.sinobrush.fan": "摺扇", diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java index a5cf36d0..10a6b94d 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java @@ -66,6 +66,8 @@ public static class Translation { public static final String GUI_BRUSH_SAVE_FAILED_NO_PAPER = "sinobrush.gui.brush.save_failed_no_paper"; public static final String GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED = "sinobrush.gui.brush.save_failed_output_occupied"; public static final String GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND = "sinobrush.gui.brush.save_failed_no_brush_on_hand"; + public static final String GUI_FAN_SETTING_HUD_POSITION = "sinobrush.gui.fan.setting_hud_position"; + public static final String GUI_FAN_SETTING_HUD_HINT = "sinobrush.gui.fan.setting_hud_hint"; public static final String ADVANCEMENT_ROOT_NAME = "sinobrush.advancement.root.name"; public static final String ADVANCEMENT_ROOT_DESC = "sinobrush.advancement.root.desc"; diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java index 54bcf8e7..01089585 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java @@ -9,12 +9,14 @@ import games.moegirl.sinocraft.sinobrush.item.component.SBRDataComponents; import games.moegirl.sinocraft.sinobrush.network.SBRNetworks; import games.moegirl.sinocraft.sinobrush.stat.SBRStats; +import games.moegirl.sinocraft.sinocore.utility.config.ConfigPack; import org.slf4j.Logger; public class SinoBrush { public static final String MOD_NAME = "SinoBrush"; public static final String MODID = "sinobrush"; public static final Logger LOGGER = LogUtils.getLogger(); + public static final ConfigPack CONFIGURATIONS = new ConfigPack(MODID); public static void init() { LOGGER.info("SinoBrush ver {}, build at {}", SBRVersion.VERSION, SBRVersion.BUILD_TIME.toString()); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java index ab8d3c1f..5fdd6601 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java @@ -1,13 +1,15 @@ package games.moegirl.sinocraft.sinobrush.client; import com.mojang.blaze3d.vertex.PoseStack; +import games.moegirl.sinocraft.sinobrush.SinoBrush; import games.moegirl.sinocraft.sinobrush.item.FanItem; import games.moegirl.sinocraft.sinobrush.item.SBRItems; import games.moegirl.sinocraft.sinocore.gui.widgets.WidgetLoader; import games.moegirl.sinocraft.sinocore.gui.widgets.Widgets; import games.moegirl.sinocraft.sinocore.gui.widgets.entry.TextureEntry; +import games.moegirl.sinocraft.sinocore.utility.config.Configs; +import games.moegirl.sinocraft.sinocore.utility.config.IConfigVisitor; import net.minecraft.Util; -import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -19,6 +21,7 @@ import net.minecraft.world.item.ItemStack; import org.joml.Matrix4f; +import java.io.IOException; import java.util.List; public class FanRenderer { @@ -75,18 +78,18 @@ private static int drawCharacters(GuiGraphics guiGraphics, Font font, String lin return y; } - public static void renderInHud(GuiGraphics guiGraphics, DeltaTracker partialTick) { + public static void renderInHud(GuiGraphics guiGraphics) { LocalPlayer player = Minecraft.getInstance().player; if (player != null) { ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, partialTick, stack); + renderInHud(guiGraphics, stack); return; } stack = player.getItemInHand(InteractionHand.OFF_HAND); if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, partialTick, stack); + renderInHud(guiGraphics, stack); return; } @@ -94,18 +97,31 @@ public static void renderInHud(GuiGraphics guiGraphics, DeltaTracker partialTick for (int i = 0; i < 9; i++) { stack = inventory.getItem(i); if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, partialTick, stack); + renderInHud(guiGraphics, stack); return; } } } } - private static void renderInHud(GuiGraphics guiGraphics, DeltaTracker partialTick, ItemStack stack) { + private static void renderInHud(GuiGraphics guiGraphics, ItemStack stack) { + int x = 0, y = 0; + float scale = 0.5f; + try { + Configs clientConfigs = SinoBrush.CONFIGURATIONS.getClientConfigs(); + IConfigVisitor fanHud = clientConfigs.getObject("FanHUD"); + x = fanHud.getInteger("x", 0); + y = fanHud.getInteger("y", 0); + scale = fanHud.getFloat("scale", 0.5f); + } catch (IOException e) { + e.printStackTrace(System.err); + } + List lines = FanItem.getLines(stack); PoseStack pose = guiGraphics.pose(); pose.pushPose(); - pose.scale(0.5f, 0.5f, 1); + pose.translate(x, y, 0); + pose.scale(scale, scale, 1); renderInGui(guiGraphics, Minecraft.getInstance().font, 0, 0, lines, -1, 0); pose.popPose(); } diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java index 37cf7c6f..2304c9d7 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java @@ -55,6 +55,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "Sign failed: No paper provided"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "Sign failed: Take the previous calligraphy first"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "Sign failed: Why you want write without a writing brush?"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "Setting HUD position"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "Drag to set position, scroll to set size."); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "SinoBrush"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "Painting Lives by Brush, Writing Elegance in Ink."); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java index 8c2e33c6..227c5f21 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java @@ -55,6 +55,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "落款失败:找不到宣纸"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "落款失败:请取走之前的作品"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失败:不用笔画画,你是怎么做到的?"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "设置 HUD 位置"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖动调整位置,滚动滚轮调整大小"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "华夏云墨"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "丹青描绘浮生,云墨书尽芳华"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java index 7cfe7519..79886ba8 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java @@ -55,6 +55,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "落款失敗:找不到宣紙"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "落款失敗:請取走之前的作品"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失敗:不用筆畫畫,你是怎麼做到的?"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "設定 HUD 位置"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖動調整位置,滾動滾輪調整大小"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "丹青描繪浮生,雲墨書盡芳華"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "歡迎遊玩《華夏雲墨》"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java index 05b45868..a52a4195 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java @@ -55,6 +55,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "落款失敗:找不到宣紙"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "落款失敗:請取走之前的作品"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失敗:不用筆畫畫,你是怎麼做到的?"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "設定 HUD 位置"); + delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖動調整位置,滾動滾輪調整大小"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "丹青描繪浮生,雲墨書盡芳華"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "歡迎遊玩《華夏雲墨》"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java index 48317617..8ad929cc 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java @@ -1,15 +1,21 @@ package games.moegirl.sinocraft.sinobrush.gui.screen; +import games.moegirl.sinocraft.sinobrush.SBRConstants; +import games.moegirl.sinocraft.sinobrush.SinoBrush; import games.moegirl.sinocraft.sinobrush.client.FanRenderer; import games.moegirl.sinocraft.sinobrush.network.Common2FanLines; import games.moegirl.sinocraft.sinocore.gui.widgets.entry.TextureEntry; import games.moegirl.sinocraft.sinocore.network.NetworkManager; +import games.moegirl.sinocraft.sinocore.utility.config.IConfigVisitor; import net.minecraft.Util; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import org.lwjgl.glfw.GLFW; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -24,6 +30,8 @@ public class FanScreen extends Screen { private int currentLine = -1; private long focusedTime = 0; private boolean isChanged = false; + private Button fanHudChangeButton; + private boolean isFanHudChanging = false; public FanScreen(List lines) { super(Component.literal("fan")); @@ -37,12 +45,32 @@ public FanScreen(List lines) { protected void init() { this.leftPos = (this.width - this.imageWidth) / 2; this.topPos = (this.height - this.imageHeight) / 2; + + Component title = Component.translatable(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION); + int btnWidth = font.width(title) + 20; + if (fanHudChangeButton == null) { + fanHudChangeButton = Button.builder(title, this::setHudPosition) + .pos(leftPos + imageWidth - btnWidth, topPos + imageHeight - 20) + .size(btnWidth, 20) + .build(); + addRenderableWidget(fanHudChangeButton); + } else { + fanHudChangeButton.setPosition(leftPos + imageWidth - btnWidth, topPos + imageHeight - 20); + } } @Override public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { super.render(guiGraphics, mouseX, mouseY, partialTick); - FanRenderer.renderInGui(guiGraphics, font, leftPos, topPos, lines, currentLine, focusedTime); + if (isFanHudChanging) { + FanRenderer.renderInHud(guiGraphics); + MutableComponent hint = Component.translatable(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT); + int tw = font.width(hint); + int th = font.wordWrapHeight(hint, tw); + guiGraphics.drawString(font, hint, leftPos + imageWidth / 2 - tw / 2, topPos + imageHeight - th, 0xFFFFFF); + } else { + FanRenderer.renderInGui(guiGraphics, font, leftPos, topPos, lines, currentLine, focusedTime); + } } private void moveCursorLeft() { @@ -57,6 +85,11 @@ private void moveCursorRight() { } } + private void setHudPosition(Button button) { + button.visible = false; + isFanHudChanging = true; + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (mouseX >= leftPos && mouseX < leftPos + imageWidth && mouseY >= topPos && mouseY < topPos + imageHeight) { @@ -72,7 +105,23 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == GLFW.GLFW_KEY_LEFT) { + if (keyCode == GLFW.GLFW_KEY_ESCAPE) { + if (isFanHudChanging) { + // 切换状态 + isFanHudChanging = false; + fanHudChangeButton.visible = true; + // 保存扇 HUD 位置 + try { + SinoBrush.CONFIGURATIONS.getClientConfigs().save(); + } catch (IOException e) { + e.printStackTrace(System.err); + } + return true; + } else if (currentLine != -1) { + currentLine = -1; + return true; + } + } else if (keyCode == GLFW.GLFW_KEY_LEFT) { moveCursorLeft(); return true; } else if (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER) { @@ -89,7 +138,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (!content.isEmpty()) { lines.set(currentLine, Component.literal(content.substring(0, content.length() - 1))); isChanged = true; - } else if (currentLine > 0){ + } else if (currentLine > 0) { moveCursorRight(); } return true; @@ -114,6 +163,41 @@ public boolean charTyped(char codePoint, int modifiers) { return super.charTyped(codePoint, modifiers); } + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { + if (isFanHudChanging) { + try { + IConfigVisitor configs = SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD"); + float ds = scrollY > 0 ? 0.05f : -0.05f; + float scale = configs.getFloat("scale", 0.5f) + ds; + scale = Math.max(0.05f, scale); + configs.setFloat("scale", scale); + return true; + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (isFanHudChanging) { + try { + IConfigVisitor configs = SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD"); + int x = configs.getInteger("x", 0) + (int) dragX; + int y = configs.getInteger("y", 0) + (int) dragY; + configs.setInteger("x", x); + configs.setInteger("y", y); + return true; + } catch (IOException e) { + e.printStackTrace(System.err); + } + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + private Component getComponentAt(int i) { for (int j = lines.size(); j <= i; j++) { lines.add(Component.empty()); @@ -126,6 +210,11 @@ public void onClose() { if (isChanged) { NetworkManager.sendToServer(new Common2FanLines(lines)); } + try { + SinoBrush.CONFIGURATIONS.getClientConfigs().save(); + } catch (IOException e) { + e.printStackTrace(System.err); + } super.onClose(); } } diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java index 5846d69a..e4cae0c8 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java @@ -21,6 +21,6 @@ public static void register() { } }); - RenderEvents.BEFORE_RENDER_HUD.register(args -> FanRenderer.renderInHud(args.guiGraphics(), args.partialTick())); + RenderEvents.BEFORE_RENDER_HUD.register(args -> FanRenderer.renderInHud(args.guiGraphics())); } } diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java index 187b944f..6d51ee7d 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java @@ -75,6 +75,14 @@ public void appendHoverText(ItemStack stack, TooltipContext context, public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { var stack = player.getItemInHand(usedHand); + if (player.isShiftKeyDown()) { + if (level.isClientSide) { + ((Runnable) () -> net.minecraft.client.Minecraft.getInstance().setScreen( + new games.moegirl.sinocraft.sinobrush.gui.screen.FanScreen(getLines(stack)))).run(); + } + return InteractionResultHolder.success(stack); + } + if (!player.getCooldowns().isOnCooldown(this)) { return InteractionResultHolder.success(transmute(player, stack, SBRItems.FOLDED_FAN.get(), 100)); } diff --git a/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCorePlatformImpl.java b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCorePlatformImpl.java index 0647a7e5..7b603859 100644 --- a/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCorePlatformImpl.java +++ b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCorePlatformImpl.java @@ -5,6 +5,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.server.MinecraftServer; +import java.nio.file.Path; import java.util.concurrent.CompletableFuture; public class SinoCorePlatformImpl { @@ -22,4 +23,8 @@ public static boolean isDevelopmentEnvironment() { public static DataGenContext buildDataGeneratorContext(Object object, CompletableFuture registriesFuture) { throw new IllegalStateException("DataProvider only for forge platform."); } + + public static Path getConfigFolder() { + return FabricLoader.getInstance().getConfigDir(); + } } diff --git a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/SinoCorePlatformImpl.java b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/SinoCorePlatformImpl.java index ce8e3ef2..87679af5 100644 --- a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/SinoCorePlatformImpl.java +++ b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/SinoCorePlatformImpl.java @@ -2,8 +2,11 @@ import net.minecraft.server.MinecraftServer; import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.FMLPaths; import net.neoforged.neoforge.server.ServerLifecycleHooks; +import java.nio.file.Path; + public class SinoCorePlatformImpl { public static MinecraftServer getServer() { @@ -13,4 +16,8 @@ public static MinecraftServer getServer() { public static boolean isDevelopmentEnvironment() { return !FMLLoader.isProduction(); } + + public static Path getConfigFolder() { + return FMLPaths.CONFIGDIR.get(); + } } diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java index d82c655f..500f690e 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java @@ -1,8 +1,13 @@ package games.moegirl.sinocraft.sinocore; import dev.architectury.injectables.annotations.ExpectPlatform; +import games.moegirl.sinocraft.sinocore.data.gen.IDataGenContext; +import net.minecraft.core.HolderLookup; import net.minecraft.server.MinecraftServer; +import java.nio.file.Path; +import java.util.concurrent.CompletableFuture; + public class SinoCorePlatform { @ExpectPlatform @@ -14,4 +19,27 @@ public static MinecraftServer getServer() { public static boolean isDevelopmentEnvironment() { throw new AssertionError(); } + + /** + * 创建用于创建 DataProvider 对象的上下文,不同平台使用不同类型的上下文对象。其中第一个参数类型如下: + *
    + *
  • Forge: GatherDataEvent
  • + *
  • Fabric: FabricDataOutput,可以从 FabricDataGenerator.Pack 中获取
  • + *
+ * + * @param platformContext 用于获取目录与 Mod 信息的上下文相关对象 + * @param registriesFuture 用于获取注册表信息的上下文对象 + */ + @ExpectPlatform + public static IDataGenContext buildDataGeneratorContext(Object platformContext, CompletableFuture registriesFuture) { + throw new AssertionError(); + } + + /** + * 获取配置文件目录 + */ + @ExpectPlatform + public static Path getConfigFolder() { + throw new AssertionError(); + } } diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/ConfigPack.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/ConfigPack.java new file mode 100644 index 00000000..a90fb873 --- /dev/null +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/ConfigPack.java @@ -0,0 +1,44 @@ +package games.moegirl.sinocraft.sinocore.utility.config; + +import games.moegirl.sinocraft.sinocore.SinoCorePlatform; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +public class ConfigPack { + + private final Path configPath; + private final Map visitors = new HashMap<>(); + + public ConfigPack(String modid) { + configPath = SinoCorePlatform.getConfigFolder().resolve(modid); + } + + public Configs getClientConfigs() throws IOException { + return getJsonConfigs("client"); + } + + public Configs getCommonConfigs() throws IOException { + return getJsonConfigs("common"); + } + + // todo 线程安全 + public Configs getJsonConfigs(String type) throws IOException { + Path configFile = configPath.resolve(type + ".json"); + + if (visitors.containsKey(configFile)) { + return new Configs(configFile, visitors.get(configFile)); + } + + IConfigVisitor content = JsonVisitor.create(configFile); + fixConfigFile(type, configFile, content); + visitors.put(configFile, content); + return new Configs(configFile, content); + } + + private void fixConfigFile(String type, Path filePath, IConfigVisitor visitor) { + // TODO 以后如果需要修改配置文件格式,在这里处理旧文件 + } +} diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java new file mode 100644 index 00000000..907c3a2c --- /dev/null +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java @@ -0,0 +1,52 @@ +package games.moegirl.sinocraft.sinocore.utility.config; + +import java.io.IOException; +import java.nio.file.Path; + +public class Configs implements IConfigVisitor { + + private final Path filePath; + private final IConfigVisitor visitor; + + public Configs(Path filePath, IConfigVisitor visitor) { + this.filePath = filePath; + this.visitor = visitor; + } + + public void save() throws IOException { + visitor.save(filePath); + } + + // ------------------------------------------------------------------- + + + @Override + public int getInteger(String key, int defaultValue) { + return visitor.getInteger(key, defaultValue); + } + + @Override + public float getFloat(String key, float defaultValue) { + return visitor.getFloat(key, defaultValue); + } + + @Override + public IConfigVisitor getObject(String key) { + return visitor.getObject(key); + } + + @Override + public void setInteger(String name, int value) { + visitor.setInteger(name, value); + } + + @Override + public void setFloat(String name, float value) { + visitor.setFloat(name, value); + } + + @Override + public void save(Path path) throws IOException { + visitor.save(path); + } +} diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java new file mode 100644 index 00000000..a7cdb1bf --- /dev/null +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java @@ -0,0 +1,21 @@ +package games.moegirl.sinocraft.sinocore.utility.config; + +import java.io.IOException; +import java.nio.file.Path; + +public interface IConfigVisitor { + + int getInteger(String key, int defaultValue); + + float getFloat(String key, float defaultValue); + + IConfigVisitor getObject(String key); + + void setInteger(String name, int value); + + void setFloat(String name, float value); + + // TODO 其他类型等需要再加 + + void save(Path path) throws IOException; +} diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java new file mode 100644 index 00000000..adf1fc31 --- /dev/null +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java @@ -0,0 +1,73 @@ +package games.moegirl.sinocraft.sinocore.utility.config; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class JsonVisitor implements IConfigVisitor { + + public static JsonVisitor create(Path path) throws IOException { + if (!Files.isRegularFile(path)) { + return new JsonVisitor(new JsonObject()); + } else { + String json = Files.readString(path); + return new JsonVisitor(JsonParser.parseString(json).getAsJsonObject()); + } + } + + private final JsonObject json; + + public JsonVisitor(JsonObject json) { + this.json = json; + } + + public JsonObject getJson() { + return json; + } + + @Override + public int getInteger(String key, int defaultValue) { + return json.has(key) ? json.get(key).getAsInt() : defaultValue; + } + + @Override + public float getFloat(String key, float defaultValue) { + return json.has(key) ? json.get(key).getAsFloat() : defaultValue; + } + + @Override + public IConfigVisitor getObject(String key) { + if (json.has(key)) { + return new JsonVisitor(json.getAsJsonObject(key)); + } else { + JsonObject object = new JsonObject(); + json.add(key, object); + return new JsonVisitor(object); + } + } + + @Override + public void setInteger(String name, int value) { + json.addProperty(name, value); + } + + @Override + public void setFloat(String name, float value) { + json.addProperty(name, value); + } + + @Override + public void save(Path path) throws IOException { + if (!Files.isRegularFile(path)) { + Path parent = path.getParent(); + if (!Files.isDirectory(parent)) { + Files.createDirectories(parent); + } + Files.createFile(path); + } + Files.writeString(path, json.toString()); + } +} From c99931616793b967f2110906373a7168f3883f00 Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Mon, 24 Mar 2025 19:05:03 +0800 Subject: [PATCH 05/13] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=87=A0?= =?UTF-8?q?=E4=B8=AA=20server=20=E7=AB=AF=E7=B1=BB=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../games/moegirl/sinocraft/sinobrush/item/FanItem.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java index 6d51ee7d..187b944f 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/FanItem.java @@ -75,14 +75,6 @@ public void appendHoverText(ItemStack stack, TooltipContext context, public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { var stack = player.getItemInHand(usedHand); - if (player.isShiftKeyDown()) { - if (level.isClientSide) { - ((Runnable) () -> net.minecraft.client.Minecraft.getInstance().setScreen( - new games.moegirl.sinocraft.sinobrush.gui.screen.FanScreen(getLines(stack)))).run(); - } - return InteractionResultHolder.success(stack); - } - if (!player.getCooldowns().isOnCooldown(this)) { return InteractionResultHolder.success(transmute(player, stack, SBRItems.FOLDED_FAN.get(), 100)); } From 6abcd6d9958e4b85e14b5d37a72f766b2b14095c Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Fri, 28 Mar 2025 17:49:02 +0800 Subject: [PATCH 06/13] feat: move GUI render event to RenderEventImpl --- .../client/render/neoforge/RenderEventImpl.java | 7 +++++++ .../eventhandler/ScreenEventHandler.java | 16 ---------------- 2 files changed, 7 insertions(+), 16 deletions(-) delete mode 100644 sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java diff --git a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventImpl.java b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventImpl.java index 33840ac0..d7e7a97c 100644 --- a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventImpl.java +++ b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventImpl.java @@ -2,10 +2,12 @@ import games.moegirl.sinocraft.sinocore.SinoCore; import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; +import games.moegirl.sinocraft.sinocore.event.client.args.render.BeforeRenderHudArgs; import games.moegirl.sinocraft.sinocore.event.client.args.render.RenderItemInFrameArgs; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.RenderGuiEvent; import net.neoforged.neoforge.client.event.RenderItemInFrameEvent; @EventBusSubscriber(modid = SinoCore.MODID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) @@ -19,4 +21,9 @@ public static void onRenderInFrame(RenderItemInFrameEvent event) { event.setCanceled(true); } } + + @SubscribeEvent + public static void onGuiRender(RenderGuiEvent.Pre event) { + RenderEvents.BEFORE_RENDER_HUD.invoke(new BeforeRenderHudArgs(event.getGuiGraphics(), event.getPartialTick())); + } } diff --git a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java deleted file mode 100644 index 1022d08b..00000000 --- a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/eventhandler/ScreenEventHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package games.moegirl.sinocraft.sinocore.neoforge.eventhandler; - -import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; -import games.moegirl.sinocraft.sinocore.event.client.args.render.BeforeRenderHudArgs; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.client.event.RenderGuiEvent; - -@EventBusSubscriber -public class ScreenEventHandler { - - @SubscribeEvent - public static void onGuiRender(RenderGuiEvent.Pre event) { - RenderEvents.BEFORE_RENDER_HUD.invoke(new BeforeRenderHudArgs(event.getGuiGraphics(), event.getPartialTick())); - } -} From 3bc76aac9edac28695a0e6815a9c305e4270a11f Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sat, 29 Mar 2025 15:57:42 +0800 Subject: [PATCH 07/13] =?UTF-8?q?fix:=20Fabric=20=E7=AB=AF=20AfterBake=20?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E6=97=A0=E6=95=88=20feat:=20CUSTOM=5FITEM=5F?= =?UTF-8?q?RENDERER=20=E4=BA=8B=E4=BB=B6=EF=BC=8C=E5=8F=96=E4=BB=A3=20ISin?= =?UTF-8?q?oItem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sinocore/fabric/SinoCoreFabricClient.java | 23 +++++++++++++++++ .../src/main/resources/fabric.mod.json | 3 +++ .../render/neoforge/RenderEventModImpl.java | 25 +++++++++++++++++++ .../sinocore/event/client/RenderEvents.java | 3 +++ .../args/render/CustomItemRendererArgs.java | 12 +++++++++ 5 files changed, 66 insertions(+) create mode 100644 sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCoreFabricClient.java create mode 100644 sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventModImpl.java create mode 100644 sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java diff --git a/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCoreFabricClient.java b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCoreFabricClient.java new file mode 100644 index 00000000..c4a41386 --- /dev/null +++ b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/SinoCoreFabricClient.java @@ -0,0 +1,23 @@ +package games.moegirl.sinocraft.sinocore.fabric; + +import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; +import games.moegirl.sinocraft.sinocore.event.client.args.render.CustomItemRendererArgs; +import games.moegirl.sinocraft.sinocore.event.client.model.fabric.ModelEventImpl; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry; +import net.minecraft.world.item.Item; + +public class SinoCoreFabricClient implements ClientModInitializer { + + @Override + public void onInitializeClient() { + ModelLoadingPlugin.register(new ModelEventImpl()); + + RenderEvents.CUSTOM_ITEM_RENDERER.invoke(new CustomItemRendererArgs((renderer, items) -> { + for (Item item : items) { + BuiltinItemRendererRegistry.INSTANCE.register(item, renderer::renderByItem); + } + })); + } +} diff --git a/sinocore/sinocore-fabric/src/main/resources/fabric.mod.json b/sinocore/sinocore-fabric/src/main/resources/fabric.mod.json index 9b5ed401..8bd5bdba 100644 --- a/sinocore/sinocore-fabric/src/main/resources/fabric.mod.json +++ b/sinocore/sinocore-fabric/src/main/resources/fabric.mod.json @@ -18,6 +18,9 @@ "entrypoints": { "main": [ "games.moegirl.sinocraft.sinocore.fabric.SinoCoreFabric" + ], + "client": [ + "games.moegirl.sinocraft.sinocore.fabric.SinoCoreFabricClient" ] }, "mixins": [ diff --git a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventModImpl.java b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventModImpl.java new file mode 100644 index 00000000..16974252 --- /dev/null +++ b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/event/client/render/neoforge/RenderEventModImpl.java @@ -0,0 +1,25 @@ +package games.moegirl.sinocraft.sinocore.event.client.render.neoforge; + +import games.moegirl.sinocraft.sinocore.SinoCore; +import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; +import games.moegirl.sinocraft.sinocore.event.client.args.render.CustomItemRendererArgs; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; + +@EventBusSubscriber(modid = SinoCore.MODID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +public class RenderEventModImpl { + @SubscribeEvent + public static void onClientExtensionRegister(RegisterClientExtensionsEvent event) { + RenderEvents.CUSTOM_ITEM_RENDERER.invoke(new CustomItemRendererArgs((renderer, items) -> + event.registerItem(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return renderer; + } + }, items))); + } +} diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java index 89263cd4..1ca20d1a 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/RenderEvents.java @@ -5,10 +5,13 @@ import games.moegirl.sinocraft.sinocore.event.IEvent; import games.moegirl.sinocraft.sinocore.event.IEventHandler; import games.moegirl.sinocraft.sinocore.event.client.args.render.BeforeRenderHudArgs; +import games.moegirl.sinocraft.sinocore.event.client.args.render.CustomItemRendererArgs; import games.moegirl.sinocraft.sinocore.event.client.args.render.RenderItemInFrameArgs; public class RenderEvents { public static final IEvent> RENDER_ITEM_IN_FRAME = EventFactory.createCancellableEvent(RenderItemInFrameArgs.class); public static final IEvent> BEFORE_RENDER_HUD = EventFactory.createEvent(BeforeRenderHudArgs.class); + + public static final IEvent > CUSTOM_ITEM_RENDERER = EventFactory.createEvent(CustomItemRendererArgs.class); } diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java new file mode 100644 index 00000000..8c3aa886 --- /dev/null +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java @@ -0,0 +1,12 @@ +package games.moegirl.sinocraft.sinocore.event.client.args.render; + +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.item.Item; + +public record CustomItemRendererArgs(RendererRegister register) { + + public interface RendererRegister { + + void register(BlockEntityWithoutLevelRenderer renderer, Item... items); + } +} From 176955276ebbb5938c95d6736fab488e0065f1ce Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sat, 29 Mar 2025 17:22:57 +0800 Subject: [PATCH 08/13] feat: key --- .../registry/fabric/FabricKeyRegistry.java | 59 +++++++++++++++ .../registry/fabric/RegistryManagerImpl.java | 4 + .../neoforge/NeoForgeKeyRegistry.java | 73 +++++++++++++++++++ .../neoforge/RegistryManagerImpl.java | 4 + .../sinocore/registry/IKeyRegistry.java | 23 ++++++ .../sinocore/registry/RegistryManager.java | 13 ++++ 6 files changed, 176 insertions(+) create mode 100644 sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/FabricKeyRegistry.java create mode 100644 sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/NeoForgeKeyRegistry.java create mode 100644 sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/IKeyRegistry.java diff --git a/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/FabricKeyRegistry.java b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/FabricKeyRegistry.java new file mode 100644 index 00000000..ebcd5a7a --- /dev/null +++ b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/FabricKeyRegistry.java @@ -0,0 +1,59 @@ +package games.moegirl.sinocraft.sinocore.registry.fabric; + +import com.mojang.datafixers.util.Pair; +import games.moegirl.sinocraft.sinocore.registry.IKeyRegistry; +import net.fabricmc.api.EnvType; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; + +public class FabricKeyRegistry implements IKeyRegistry { + + private final List>> keys = new ArrayList<>(); + private final String modId; + + public FabricKeyRegistry(String modId) { + this.modId = modId; + } + + @Override + public KeyMapping register(KeyMapping key, BiConsumer action) { + keys.add(new Pair<>(key, action)); + return key; + } + + @Override + public KeyMapping register(KeyMapping key, Runnable action) { + register(key, (k, c) -> action.run()); + return key; + } + + @Override + public String modId() { + return modId; + } + + @Override + public void register() { + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { + for (Pair> key : keys) { + KeyBindingHelper.registerKeyBinding(key.getFirst()); + } + ClientTickEvents.END_CLIENT_TICK.register(client -> { + for (Pair> key : keys) { + while (key.getFirst().consumeClick()) { + key.getSecond().accept(key.getFirst(), Minecraft.getInstance()); + } + } + }); + } else { + throw new RuntimeException("Key registry can only be registered in client side (use in ClientModInitializer entrypoint)!"); + } + } +} diff --git a/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/RegistryManagerImpl.java b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/RegistryManagerImpl.java index 2aebf200..fafccf93 100644 --- a/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/RegistryManagerImpl.java +++ b/sinocore/sinocore-fabric/src/main/java/games/moegirl/sinocraft/sinocore/registry/fabric/RegistryManagerImpl.java @@ -29,4 +29,8 @@ public static ICommandRegistry _createCommand(String modId) { public static ICustomStatRegistry _createCustomStat(String modId) { return new FabricCustomStatRegistry(modId); } + + public static IKeyRegistry _createKey(String modId) { + return new FabricKeyRegistry(modId); + } } diff --git a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/NeoForgeKeyRegistry.java b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/NeoForgeKeyRegistry.java new file mode 100644 index 00000000..ad9af8d4 --- /dev/null +++ b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/NeoForgeKeyRegistry.java @@ -0,0 +1,73 @@ +package games.moegirl.sinocraft.sinocore.registry.neoforge; + +import com.mojang.datafixers.util.Pair; +import games.moegirl.sinocraft.sinocore.registry.IKeyRegistry; +import games.moegirl.sinocraft.sinocore.utility.neoforge.ModBusHelper; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.common.NeoForge; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.BiConsumer; + +public class NeoForgeKeyRegistry implements IKeyRegistry { + + private final Set>> keys = new HashSet<>(); + private final String modId; + private final IEventBus bus; + + public NeoForgeKeyRegistry(String modId) { + this.modId = modId; + this.bus = ModBusHelper.getModBus(modId); + } + + @Override + public KeyMapping register(KeyMapping key, BiConsumer action) { + keys.add(new Pair<>(key, action)); + return key; + } + + @Override + public KeyMapping register(KeyMapping key, Runnable action) { + register(key, (k, c) -> action.run()); + return key; + } + + @Override + public String modId() { + return modId; + } + + @Override + public void register() { + bus.register(new KeyRegisterHandler()); + NeoForge.EVENT_BUS.register(new KeyActionHandler()); + } + + private final class KeyRegisterHandler { + + @SubscribeEvent + public void onKeyRegister(RegisterKeyMappingsEvent event) { + for (Pair> key : keys) { + event.register(key.getFirst()); + } + } + } + + private final class KeyActionHandler { + + @SubscribeEvent + public void onClientTick(ClientTickEvent.Post event) { + for (Pair> key : keys) { + while (key.getFirst().consumeClick()) { + key.getSecond().accept(key.getFirst(), Minecraft.getInstance()); + } + } + } + } +} diff --git a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/RegistryManagerImpl.java b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/RegistryManagerImpl.java index ed7f7a7c..41fbdea2 100644 --- a/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/RegistryManagerImpl.java +++ b/sinocore/sinocore-neoforge/src/main/java/games/moegirl/sinocraft/sinocore/registry/neoforge/RegistryManagerImpl.java @@ -29,4 +29,8 @@ public static ICommandRegistry _createCommand(String modId) { public static ICustomStatRegistry _createCustomStat(String modId) { return new NeoForgeCustomStatRegistry(modId); } + + public static IKeyRegistry _createKey(String modId) { + return new NeoForgeKeyRegistry(modId); + } } diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/IKeyRegistry.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/IKeyRegistry.java new file mode 100644 index 00000000..d12a2006 --- /dev/null +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/IKeyRegistry.java @@ -0,0 +1,23 @@ +package games.moegirl.sinocraft.sinocore.registry; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; + +import java.util.function.BiConsumer; + +public interface IKeyRegistry extends IRegistrable { + + /** + * 注册快捷键 + * @param key 快捷键信息 + * @param action 快捷键行为,仅客户端触发 + */ + KeyMapping register(KeyMapping key, BiConsumer action); + + /** + * 注册快捷键 + * @param key 快捷键信息 + * @param action 快捷键行为,仅客户端触发 + */ + KeyMapping register(KeyMapping key, Runnable action); +} diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/RegistryManager.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/RegistryManager.java index 56225945..cc810ed3 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/RegistryManager.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/registry/RegistryManager.java @@ -27,6 +27,7 @@ public class RegistryManager { private static final Map> SCREEN_MAP = new HashMap<>(); private static final Map> COMMAND_MAP = new ConcurrentHashMap<>(); + private static final Map> KEY_MAP = new ConcurrentHashMap<>(); private static > U appendRegistry(String modId, ResourceKey> key, U registry) { REGISTRIES.computeIfAbsent(modId, __ -> new HashMap<>()) @@ -131,6 +132,13 @@ public synchronized static ICommandRegistry createCommand(String modId) { return appendRegistrable(COMMAND_MAP, modId, RegistryManager._createCommand(modId)); } + /** + * 创建用于 KeyMapping 的 SinoCore 注册表 + */ + public synchronized static IKeyRegistry createKey(String modId) { + return appendRegistrable(KEY_MAP, modId, RegistryManager._createKey(modId)); + } + @ExpectPlatform static IRegistry _create(String modId, ResourceKey> key) { throw new AssertionError(); @@ -160,4 +168,9 @@ static ICommandRegistry _createCommand(String modId) { static ICustomStatRegistry _createCustomStat(String modId) { throw new AssertionError(); } + + @ExpectPlatform + static IKeyRegistry _createKey(String modId) { + throw new AssertionError(); + } } From d04a5b7313496a733e225e0d8cfe7a21b4f3a38b Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sat, 29 Mar 2025 18:20:17 +0800 Subject: [PATCH 09/13] =?UTF-8?q?feat:=20=E6=89=8B=E4=B8=AD=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E6=89=87=E5=AD=90=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sinobrush/client/FanRenderer.java | 98 ++++++++++++++++--- .../sinobrush/gui/screen/FanScreen.java | 2 +- .../sinobrush/handler/RenderHandlers.java | 15 +++ .../sinocraft/sinobrush/item/SBRItems.java | 3 +- .../utility/debug/FanItemRenderAdjust.java | 98 +++++++++++++++++++ 5 files changed, 200 insertions(+), 16 deletions(-) create mode 100644 sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/utility/debug/FanItemRenderAdjust.java diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java index 5fdd6601..dc8cf5d3 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java @@ -14,40 +14,111 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import org.apache.logging.log4j.util.Lazy; import org.joml.Matrix4f; import java.io.IOException; +import java.util.EnumSet; import java.util.List; -public class FanRenderer { +public class FanRenderer extends BlockEntityWithoutLevelRenderer { + public static final int MAX_DISPLAY_LINES = 21; + public static final ModelResourceLocation MODEL_FAN = ModelResourceLocation.inventory(SBRItems.FAN.getId()); + public static BakedModel DEFAULT_FAN_MODEL; + + private static final EnumSet TEXT_TO_RENDER = EnumSet.of( + ItemDisplayContext.FIRST_PERSON_LEFT_HAND, + ItemDisplayContext.FIRST_PERSON_RIGHT_HAND, + ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, + ItemDisplayContext.THIRD_PERSON_LEFT_HAND); + + public static final Lazy TEXTURE = Lazy.lazy(() -> WidgetLoader.loadWidgets(ResourceLocation.fromNamespaceAndPath(SinoBrush.MODID, "textures/gui/fan"))); + public static final double[] LINE_X_IN_HAND = {0.440, 0.400, 0.350, 0.310, 0.270, 0.220, 0.170, 0.110, 0.050, -0.010, -0.080, -0.150, -0.220, -0.280, -0.330, -0.380, -0.420, -0.450, -0.470, -0.510, -0.540}; + public static final double[] LINE_Y_IN_HAND = {0.060, 0.080, 0.090, 0.110, 0.140, 0.160, 0.180, 0.200, 0.220, 0.220, 0.210, 0.200, 0.170, 0.150, 0.130, 0.120, 0.080, 0.060, 0.030, 0.010, -0.030}; + public static final double[] LINE_R_IN_HAND = {45, 41, 38, 36, 33, 30, 28, 22, 17, 14, 7, 1, -7, -13, -17, -21, -25, -26, -30, -34, -42}; + private static final float[] LINE_X_IN_GUI = {231, 223, 213, 203, 191, 181, 165, 152, 138, 117, 102, 89, 77, 67, 56, 46, 37, 28, 20, 14, 9,}; + private static final float[] LINE_Y_IN_GUI = {64, 54, 43, 35, 27, 22, 17, 13, 10, 11, 13, 18, 22, 28, 34, 43, 52, 62, 72, 83, 95,}; + private static final float[] LINE_R_IN_GUI = {45, 41, 35, 30, 25, 22, 14, 9, 4, -6, -13, -19, -23, -26, -30, -35, -39, -45, -50, -55, -58,}; + + public FanRenderer() { + super(Minecraft.getInstance().getBlockEntityRenderDispatcher(), Minecraft.getInstance().getEntityModels()); + } + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext displayContext, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (stack.isEmpty() || DEFAULT_FAN_MODEL == null) return; + + poseStack.popPose(); + + // 绘制模型 + boolean leftHand = displayContext == ItemDisplayContext.FIRST_PERSON_LEFT_HAND + || displayContext == ItemDisplayContext.THIRD_PERSON_LEFT_HAND; + ItemRenderer renderer = Minecraft.getInstance().getItemRenderer(); + renderer.render(stack, displayContext, leftHand, poseStack, buffer, packedLight, packedOverlay, DEFAULT_FAN_MODEL); + + // 绘制文字 + List lines = FanItem.getLines(stack); + if (TEXT_TO_RENDER.contains(displayContext) && !lines.isEmpty()) { + Font font = Minecraft.getInstance().font; + ItemTransform transform = DEFAULT_FAN_MODEL.getTransforms().getTransform(displayContext); + transform.apply(leftHand, poseStack); + poseStack.mulPose(new Matrix4f().rotate((float) Math.toRadians(-45), 0, 0, 1)); + for (int i = 0; i < Math.min(lines.size(), MAX_DISPLAY_LINES); i++) { + float r = (float) Math.toRadians(LINE_R_IN_HAND[i]); + poseStack.pushPose(); + poseStack.translate(LINE_X_IN_HAND[i], LINE_Y_IN_HAND[i], 0.05); + poseStack.scale(0.003f, -0.003f, 1); + poseStack.mulPose(new Matrix4f().rotate(r, 0, 0, 1)); + drawCharactersInHand(lines.get(i), font, poseStack, buffer, packedLight); + poseStack.popPose(); + } + } + + poseStack.pushPose(); + } - public static final Widgets TEXTURE = WidgetLoader.loadWidgets(ResourceLocation.parse("sinobrush:textures/gui/fan")); - public static final float[] LINE_X = {231, 223, 213, 203, 191, 181, 165, 152, 138, 117, 102, 89, 77, 67, 56, 46, 37, 28, 20, 14, 9,}; - public static final float[] LINE_Y = {64, 54, 43, 35, 27, 22, 17, 13, 10, 11, 13, 18, 22, 28, 34, 43, 52, 62, 72, 83, 95,}; - public static final float[] LINE_R = {45, 41, 35, 30, 25, 22, 14, 9, 4, -6, -13, -19, -23, -26, -30, -35, -39, -45, -50, -55, -58,}; + private void drawCharactersInHand(Component text, Font font, PoseStack poseStack, MultiBufferSource buffer, int packedLight) { + String line = text.getString(); + int y = 0; + for (char c : line.toCharArray()) { + String s = String.valueOf(c); + int w = font.width(s); + int h = font.wordWrapHeight(s, w); + font.drawInBatch(s, 0, y, 0x414141, false, poseStack.last().pose(), buffer, + Font.DisplayMode.NORMAL, 0, packedLight, font.isBidirectional()); + y += h; + } + } public static void renderInGui(GuiGraphics guiGraphics, Font font, int x, int y, List lines, int currentLine, long focusedTime) { - TextureEntry background = (TextureEntry) TEXTURE.getWidget("background"); - guiGraphics.blit(TEXTURE.getTexture(), x, y, + TextureEntry background = (TextureEntry) TEXTURE.get().getWidget("background"); + guiGraphics.blit(TEXTURE.get().getTexture(), x, y, background.getWidth(), background.getHeight(), background.getTextureX(), background.getTextureY(), background.getTextureWidth(), background.getTextureHeight(), - TEXTURE.getWidth(), TEXTURE.getHeight()); + TEXTURE.get().getWidth(), TEXTURE.get().getHeight()); PoseStack pose = guiGraphics.pose(); for (int i = 0; i < MAX_DISPLAY_LINES; i++) { if (i >= lines.size() && currentLine != i) continue; - float offX = x + LINE_X[i]; - float offY = y + LINE_Y[i]; - float r = (float) Math.toRadians(LINE_R[i]); + float offX = x + LINE_X_IN_GUI[i]; + float offY = y + LINE_Y_IN_GUI[i]; + float r = (float) Math.toRadians(LINE_R_IN_GUI[i]); pose.pushPose(); pose.translate(offX, offY, 0); pose.scale(0.6f, 0.6f, 1); @@ -55,18 +126,17 @@ public static void renderInGui(GuiGraphics guiGraphics, Font font, int x, int y, int ny = 0; // 文本内容 if (i < lines.size()) { - ny = drawCharacters(guiGraphics, font, lines.get(i).getString()); + ny = drawCharactersInGui(guiGraphics, font, lines.get(i).getString()); } // 编辑标记 if (currentLine == i && (Util.getMillis() - focusedTime) / 300L % 2L == 0L) { guiGraphics.drawString(font, "_", 0, ny, 0x414141); } - pose.translate(-offX, -offY, 0); pose.popPose(); } } - private static int drawCharacters(GuiGraphics guiGraphics, Font font, String line) { + private static int drawCharactersInGui(GuiGraphics guiGraphics, Font font, String line) { int y = 0; for (char c : line.toCharArray()) { String s = String.valueOf(c); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java index 8ad929cc..7987a826 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java @@ -35,7 +35,7 @@ public class FanScreen extends Screen { public FanScreen(List lines) { super(Component.literal("fan")); - TextureEntry background = (TextureEntry) TEXTURE.getWidget("background"); + TextureEntry background = (TextureEntry) TEXTURE.get().getWidget("background"); imageWidth = background.getWidth(); imageHeight = background.getHeight(); this.lines = new ArrayList<>(lines); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java index e4cae0c8..b047630c 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java @@ -4,7 +4,12 @@ import games.moegirl.sinocraft.sinobrush.client.FanRenderer; import games.moegirl.sinocraft.sinobrush.item.SBRItems; import games.moegirl.sinocraft.sinobrush.item.component.Drawing; +import games.moegirl.sinocraft.sinocore.client.model.TransformFilteredItemModel; +import games.moegirl.sinocraft.sinocore.event.client.ModelEvents; import games.moegirl.sinocraft.sinocore.event.client.RenderEvents; +import net.minecraft.world.item.ItemDisplayContext; + +import java.util.List; public class RenderHandlers { public static void register() { @@ -22,5 +27,15 @@ public static void register() { }); RenderEvents.BEFORE_RENDER_HUD.register(args -> FanRenderer.renderInHud(args.guiGraphics())); + + RenderEvents.CUSTOM_ITEM_RENDERER.register(args -> + args.register().register(new FanRenderer(), SBRItems.FAN.get())); + + ModelEvents.AFTER_BAKE.register(args -> { + if (FanRenderer.MODEL_FAN.equals(args.id())) { + FanRenderer.DEFAULT_FAN_MODEL = args.model(); + args.setModel(TransformFilteredItemModel.create(args.model(), List.of(ItemDisplayContext.values()))); + } + }); } } diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/SBRItems.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/SBRItems.java index ad4dc767..84f346e3 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/SBRItems.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/item/SBRItems.java @@ -1,6 +1,7 @@ package games.moegirl.sinocraft.sinobrush.item; import games.moegirl.sinocraft.sinobrush.SinoBrush; +import games.moegirl.sinocraft.sinocore.registry.IRegRef; import games.moegirl.sinocraft.sinocore.registry.IRegistry; import games.moegirl.sinocraft.sinocore.registry.ITabRegistry; import games.moegirl.sinocraft.sinocore.registry.RegistryManager; @@ -17,7 +18,7 @@ public class SBRItems { public static ResourceKey SINO_BRUSH_TAB = TABS.register("sinobrush"); - public static Supplier FAN = ITEMS.register("fan", FanItem::new); + public static IRegRef FAN = ITEMS.register("fan", FanItem::new); public static Supplier FOLDED_FAN = ITEMS.register("folded_fan", FoldedFanItem::new); public static Supplier XUAN_PAPER = ITEMS.register("xuan_paper", XuanPaperItem::new); public static Supplier FILLED_XUAN_PAPER = ITEMS.register("filled_xuan_paper", FilledXuanPaperItem::new); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/utility/debug/FanItemRenderAdjust.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/utility/debug/FanItemRenderAdjust.java new file mode 100644 index 00000000..7172743b --- /dev/null +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/utility/debug/FanItemRenderAdjust.java @@ -0,0 +1,98 @@ +package games.moegirl.sinocraft.sinobrush.utility.debug; + +import com.mojang.blaze3d.platform.InputConstants; +import games.moegirl.sinocraft.sinobrush.client.FanRenderer; +import games.moegirl.sinocraft.sinocore.registry.IKeyRegistry; +import net.minecraft.client.KeyMapping; +import org.lwjgl.glfw.GLFW; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import static games.moegirl.sinocraft.sinobrush.client.FanRenderer.MAX_DISPLAY_LINES; + +/** + * (调试用)使用按键微调每行文字的位置 + */ +public class FanItemRenderAdjust { + + private static int currentIndex = 0; + + public static void register(IKeyRegistry keyRegistry) { + keyRegistry.register(new KeyMapping("key.sinobrush.fan_item_move_up", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_UP, + "key.sinocore.category.sinobrush"), FanItemRenderAdjust::up); + + keyRegistry.register(new KeyMapping("key.sinobrush.fan_item_move_down", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_DOWN, + "key.sinocore.category.sinobrush"), FanItemRenderAdjust::down); + + keyRegistry.register(new KeyMapping("key.sinobrush.fan_item_move_left", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_LEFT, + "key.sinocore.category.sinobrush"), FanItemRenderAdjust::left); + + keyRegistry.register(new KeyMapping("key.sinobrush.fan_item_move_right", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_RIGHT, + "key.sinocore.category.sinobrush"), FanItemRenderAdjust::right); + + keyRegistry.register(new KeyMapping("key.sinobrush.fan_item_rotate_l", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_COMMA, + "key.sinocore.category.sinobrush"), FanItemRenderAdjust::rl); + + keyRegistry.register(new KeyMapping("key.sinobrush.fan_item_rotate_r", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_PERIOD, + "key.sinocore.category.sinobrush"), FanItemRenderAdjust::rr); + + keyRegistry.register(new KeyMapping("key.sinobrush.fan_item_next", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_ENTER, + "key.sinocore.category.sinobrush"), FanItemRenderAdjust::next); + } + + public static void up() { + FanRenderer.LINE_Y_IN_HAND[currentIndex] += 0.005; + } + + public static void down() { + FanRenderer.LINE_Y_IN_HAND[currentIndex] -= 0.005; + } + + public static void left() { + FanRenderer.LINE_X_IN_HAND[currentIndex] -= 0.005; + } + + public static void right() { + FanRenderer.LINE_X_IN_HAND[currentIndex] += 0.005; + } + + public static void rl() { + FanRenderer.LINE_R_IN_HAND[currentIndex] += 0.5; + } + + public static void rr() { + FanRenderer.LINE_R_IN_HAND[currentIndex] -= 0.5; + } + + public static void next() { + if (currentIndex == MAX_DISPLAY_LINES - 1) { + System.out.println(Arrays.stream(FanRenderer.LINE_X_IN_HAND) + .mapToObj(f -> String.format("%.3f", f)) + .collect(Collectors.joining(", ", "{", "}"))); + System.out.println(Arrays.stream(FanRenderer.LINE_Y_IN_HAND) + .mapToObj(f -> String.format("%.3f", f)) + .collect(Collectors.joining(", ", "{", "}"))); + System.out.println(Arrays.stream(FanRenderer.LINE_R_IN_HAND) + .mapToObj(f -> String.format("%.1f", f)) + .collect(Collectors.joining(", ", "{", "}"))); + } else { + System.out.printf("[%d] [%.3f, %.3f // %.3f]%n", currentIndex, FanRenderer.LINE_X_IN_HAND[currentIndex], FanRenderer.LINE_Y_IN_HAND[currentIndex], FanRenderer.LINE_R_IN_HAND[currentIndex]); + } + currentIndex = (currentIndex + 1) % MAX_DISPLAY_LINES; + } +} From 48a83183ffcace5b7475e2767b0d511c8ae4dd8e Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sat, 29 Mar 2025 18:51:03 +0800 Subject: [PATCH 10/13] =?UTF-8?q?feat:=20=E6=89=87=E5=AD=90=20HUD=20?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0ef3df785a7f94cfbffdf71a30a0892f6d385df3 | 4 +- .../a8fcf7feab4b002651f8845bb8733436a9644e8d | 4 +- .../c9e6904cd53920642cfd601a942b3aed84069064 | 4 +- .../ed04c204adf5a1b37ba6904801511276adad4ec4 | 4 +- .../assets/sinobrush/lang/en_us.json | 2 + .../assets/sinobrush/lang/zh_cn.json | 2 + .../assets/sinobrush/lang/zh_hk.json | 2 + .../assets/sinobrush/lang/zh_tw.json | 2 + .../sinocraft/sinobrush/SBRConstants.java | 2 + .../sinocraft/sinobrush/SinoBrush.java | 2 - .../sinobrush/client/FanRenderer.java | 27 +++++++------ .../sinobrush/client/SinoBrushClient.java | 2 + .../data/gen/lang/EnUsLangProvider.java | 2 + .../data/gen/lang/ZhCnLangProvider.java | 2 + .../data/gen/lang/ZhHkLangProvider.java | 2 + .../data/gen/lang/ZhTwLangProvider.java | 2 + .../sinobrush/gui/screen/FanScreen.java | 39 +++++++++++++++++-- .../sinobrush/handler/RenderHandlers.java | 2 +- .../sinocore/utility/config/Configs.java | 10 +++++ .../utility/config/IConfigVisitor.java | 10 +++++ .../sinocore/utility/config/JsonVisitor.java | 22 +++++------ 21 files changed, 110 insertions(+), 38 deletions(-) diff --git a/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 b/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 index 2353385d..d96305e5 100644 --- a/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 +++ b/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-23T23:28:49.339672 Languages: zh_cn for mod: sinobrush -ff76142d7cf84eebe1cba9d66b65a1222bb23d52 assets/sinobrush/lang/zh_cn.json +// 1.21.1 2025-03-29T18:44:09.6442439 Languages: zh_cn for mod: sinobrush +e494ae3b78926b4808e7680eb49da3988a9f4850 assets/sinobrush/lang/zh_cn.json diff --git a/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d b/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d index 31267e55..de23e987 100644 --- a/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d +++ b/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-23T23:31:50.2687605 Languages: zh_hk for mod: sinobrush -450ddb8544e1113c258818d8cc5f0c39227d9f83 assets/sinobrush/lang/zh_hk.json +// 1.21.1 2025-03-29T18:44:09.6442439 Languages: zh_hk for mod: sinobrush +731d704057a0177032afe8dd96722c30291a8f28 assets/sinobrush/lang/zh_hk.json diff --git a/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 b/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 index 25ef5b77..08917094 100644 --- a/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 +++ b/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-23T23:28:49.3420868 Languages: en_us for mod: sinobrush -4eaec36d4e07cb37c4656632f34595c3e68871d5 assets/sinobrush/lang/en_us.json +// 1.21.1 2025-03-29T18:44:09.6452501 Languages: en_us for mod: sinobrush +10fddae689cf56be1d6980687273893d3410cdd8 assets/sinobrush/lang/en_us.json diff --git a/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 b/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 index 492654cb..2ab0fd51 100644 --- a/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 +++ b/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-23T23:31:50.2657454 Languages: zh_tw for mod: sinobrush -9773427b30c8a0f1fbfee385d588a621464a7df3 assets/sinobrush/lang/zh_tw.json +// 1.21.1 2025-03-29T18:44:09.6427385 Languages: zh_tw for mod: sinobrush +a4d57c057ce283e647816253db83a3a2a516d5b0 assets/sinobrush/lang/zh_tw.json diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json index 312dcbac..2f038889 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json @@ -41,6 +41,8 @@ "sinobrush.gui.brush.tooltip_save": "Save the canvas to an image", "sinobrush.gui.fan.setting_hud_hint": "Drag to set position, scroll to set size.", "sinobrush.gui.fan.setting_hud_position": "Setting HUD position", + "sinobrush.gui.setting_display": "display", + "sinobrush.gui.setting_hide": "hide", "stat.sinobrush.draw_by_brush": "Times of writing with brush", "stat.sinobrush.unfold_fan": "Times of unfolding the fan", "tag.item.sinobrush.fan": "Folding Fan", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json index 6a045694..a2cb029b 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json @@ -41,6 +41,8 @@ "sinobrush.gui.brush.tooltip_save": "保存画布为图片", "sinobrush.gui.fan.setting_hud_hint": "拖动调整位置,滚动滚轮调整大小", "sinobrush.gui.fan.setting_hud_position": "设置 HUD 位置", + "sinobrush.gui.setting_display": "显示", + "sinobrush.gui.setting_hide": "隐藏", "stat.sinobrush.draw_by_brush": "作画次数", "stat.sinobrush.unfold_fan": "展开折扇次数", "tag.item.sinobrush.fan": "折扇", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json index a0bc9a59..91a9f915 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json @@ -41,6 +41,8 @@ "sinobrush.gui.brush.tooltip_save": "保存畫布為圖片", "sinobrush.gui.fan.setting_hud_hint": "拖動調整位置,滾動滾輪調整大小", "sinobrush.gui.fan.setting_hud_position": "設定 HUD 位置", + "sinobrush.gui.setting_display": "顯示", + "sinobrush.gui.setting_hide": "隱藏", "stat.sinobrush.draw_by_brush": "作畫次數", "stat.sinobrush.unfold_fan": "展開摺扇次數", "tag.item.sinobrush.fan": "摺扇", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json index f3eead03..76d230cc 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json @@ -41,6 +41,8 @@ "sinobrush.gui.brush.tooltip_save": "保存畫布為圖片", "sinobrush.gui.fan.setting_hud_hint": "拖動調整位置,滾動滾輪調整大小", "sinobrush.gui.fan.setting_hud_position": "設定 HUD 位置", + "sinobrush.gui.setting_display": "顯示", + "sinobrush.gui.setting_hide": "隱藏", "stat.sinobrush.draw_by_brush": "作畫次數", "stat.sinobrush.unfold_fan": "展開摺扇次數", "tag.item.sinobrush.fan": "摺扇", diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java index 10a6b94d..acf23606 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java @@ -68,6 +68,8 @@ public static class Translation { public static final String GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND = "sinobrush.gui.brush.save_failed_no_brush_on_hand"; public static final String GUI_FAN_SETTING_HUD_POSITION = "sinobrush.gui.fan.setting_hud_position"; public static final String GUI_FAN_SETTING_HUD_HINT = "sinobrush.gui.fan.setting_hud_hint"; + public static final String GUI_SETTING_HIDE = "sinobrush.gui.setting_hide"; + public static final String GUI_SETTING_SHOW = "sinobrush.gui.setting_display"; public static final String ADVANCEMENT_ROOT_NAME = "sinobrush.advancement.root.name"; public static final String ADVANCEMENT_ROOT_DESC = "sinobrush.advancement.root.desc"; diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java index 01089585..d2b52f95 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SinoBrush.java @@ -4,7 +4,6 @@ import games.moegirl.sinocraft.sinobrush.data.gen.SBRDataGen; import games.moegirl.sinocraft.sinobrush.gui.SBRMenu; import games.moegirl.sinocraft.sinobrush.handler.CraftingHandlers; -import games.moegirl.sinocraft.sinobrush.handler.RenderHandlers; import games.moegirl.sinocraft.sinobrush.item.SBRItems; import games.moegirl.sinocraft.sinobrush.item.component.SBRDataComponents; import games.moegirl.sinocraft.sinobrush.network.SBRNetworks; @@ -28,7 +27,6 @@ public static void init() { SBRStats.register(); CraftingHandlers.register(); - RenderHandlers.register(); SBRDataGen.register(); } diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java index dc8cf5d3..f7ea0370 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java @@ -148,18 +148,18 @@ private static int drawCharactersInGui(GuiGraphics guiGraphics, Font font, Strin return y; } - public static void renderInHud(GuiGraphics guiGraphics) { + public static void renderInHud(GuiGraphics guiGraphics, boolean mustShow) { LocalPlayer player = Minecraft.getInstance().player; if (player != null) { ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, stack); + renderInHud(guiGraphics, stack, mustShow); return; } stack = player.getItemInHand(InteractionHand.OFF_HAND); if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, stack); + renderInHud(guiGraphics, stack, mustShow); return; } @@ -167,14 +167,14 @@ public static void renderInHud(GuiGraphics guiGraphics) { for (int i = 0; i < 9; i++) { stack = inventory.getItem(i); if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, stack); + renderInHud(guiGraphics, stack, mustShow); return; } } } } - private static void renderInHud(GuiGraphics guiGraphics, ItemStack stack) { + public static void renderInHud(GuiGraphics guiGraphics, ItemStack stack, boolean mustShow) { int x = 0, y = 0; float scale = 0.5f; try { @@ -183,16 +183,19 @@ private static void renderInHud(GuiGraphics guiGraphics, ItemStack stack) { x = fanHud.getInteger("x", 0); y = fanHud.getInteger("y", 0); scale = fanHud.getFloat("scale", 0.5f); + mustShow |= fanHud.getBoolean("show", true); } catch (IOException e) { e.printStackTrace(System.err); } - List lines = FanItem.getLines(stack); - PoseStack pose = guiGraphics.pose(); - pose.pushPose(); - pose.translate(x, y, 0); - pose.scale(scale, scale, 1); - renderInGui(guiGraphics, Minecraft.getInstance().font, 0, 0, lines, -1, 0); - pose.popPose(); + if (mustShow) { + List lines = FanItem.getLines(stack); + PoseStack pose = guiGraphics.pose(); + pose.pushPose(); + pose.translate(x, y, 0); + pose.scale(scale, scale, 1); + renderInGui(guiGraphics, Minecraft.getInstance().font, 0, 0, lines, -1, 0); + pose.popPose(); + } } } diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/SinoBrushClient.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/SinoBrushClient.java index 301166ce..d7d7b962 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/SinoBrushClient.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/SinoBrushClient.java @@ -1,12 +1,14 @@ package games.moegirl.sinocraft.sinobrush.client; import games.moegirl.sinocraft.sinobrush.gui.SBRScreen; +import games.moegirl.sinocraft.sinobrush.handler.RenderHandlers; import games.moegirl.sinocraft.sinobrush.item.SBRItems; import games.moegirl.sinocraft.sinocore.client.ClientRegister; public class SinoBrushClient { public static void initClient() { SBRScreen.register(); + RenderHandlers.register(); } public static void setupClient() { diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java index 2304c9d7..5f8ac4aa 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java @@ -57,6 +57,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "Sign failed: Why you want write without a writing brush?"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "Setting HUD position"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "Drag to set position, scroll to set size."); + delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "hide"); + delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "display"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "SinoBrush"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "Painting Lives by Brush, Writing Elegance in Ink."); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java index 227c5f21..137a3bc5 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java @@ -57,6 +57,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失败:不用笔画画,你是怎么做到的?"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "设置 HUD 位置"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖动调整位置,滚动滚轮调整大小"); + delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "隐藏"); + delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "显示"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "华夏云墨"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "丹青描绘浮生,云墨书尽芳华"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java index 79886ba8..5ac030de 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java @@ -57,6 +57,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失敗:不用筆畫畫,你是怎麼做到的?"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "設定 HUD 位置"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖動調整位置,滾動滾輪調整大小"); + delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "隱藏"); + delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "顯示"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "丹青描繪浮生,雲墨書盡芳華"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "歡迎遊玩《華夏雲墨》"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java index a52a4195..e1f7cc72 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java @@ -57,6 +57,8 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失敗:不用筆畫畫,你是怎麼做到的?"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "設定 HUD 位置"); delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖動調整位置,滾動滾輪調整大小"); + delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "隱藏"); + delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "顯示"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "丹青描繪浮生,雲墨書盡芳華"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "歡迎遊玩《華夏雲墨》"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java index 7987a826..64564dd3 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java @@ -6,6 +6,7 @@ import games.moegirl.sinocraft.sinobrush.network.Common2FanLines; import games.moegirl.sinocraft.sinocore.gui.widgets.entry.TextureEntry; import games.moegirl.sinocraft.sinocore.network.NetworkManager; +import games.moegirl.sinocraft.sinocore.utility.config.Configs; import games.moegirl.sinocraft.sinocore.utility.config.IConfigVisitor; import net.minecraft.Util; import net.minecraft.client.gui.GuiGraphics; @@ -32,6 +33,7 @@ public class FanScreen extends Screen { private boolean isChanged = false; private Button fanHudChangeButton; private boolean isFanHudChanging = false; + private Button fanHideButton; public FanScreen(List lines) { super(Component.literal("fan")); @@ -46,16 +48,23 @@ protected void init() { this.leftPos = (this.width - this.imageWidth) / 2; this.topPos = (this.height - this.imageHeight) / 2; - Component title = Component.translatable(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION); - int btnWidth = font.width(title) + 20; + Component titlePosition = Component.translatable(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION); + Component titleHide = Component.translatable(isHudShow() ? SBRConstants.Translation.GUI_SETTING_HIDE : SBRConstants.Translation.GUI_SETTING_SHOW); + int btnWidth = font.width(titlePosition) + 20; if (fanHudChangeButton == null) { - fanHudChangeButton = Button.builder(title, this::setHudPosition) + fanHudChangeButton = Button.builder(titlePosition, this::setHudPosition) .pos(leftPos + imageWidth - btnWidth, topPos + imageHeight - 20) .size(btnWidth, 20) .build(); addRenderableWidget(fanHudChangeButton); + fanHideButton = Button.builder(titleHide, this::setHudHide) + .pos(leftPos + imageWidth - btnWidth, topPos + imageHeight - 40) + .size(btnWidth, 20) + .build(); + addRenderableWidget(fanHideButton); } else { fanHudChangeButton.setPosition(leftPos + imageWidth - btnWidth, topPos + imageHeight - 20); + fanHideButton.setPosition(leftPos + imageWidth - btnWidth, topPos + imageHeight - 40); } } @@ -63,7 +72,7 @@ protected void init() { public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { super.render(guiGraphics, mouseX, mouseY, partialTick); if (isFanHudChanging) { - FanRenderer.renderInHud(guiGraphics); + FanRenderer.renderInHud(guiGraphics, true); MutableComponent hint = Component.translatable(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT); int tw = font.width(hint); int th = font.wordWrapHeight(hint, tw); @@ -87,9 +96,30 @@ private void moveCursorRight() { private void setHudPosition(Button button) { button.visible = false; + fanHideButton.visible = false; isFanHudChanging = true; } + private void setHudHide(Button button) { + try { + IConfigVisitor configs = SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD"); + boolean isShow = configs.flipBoolean("show", true); + Component titleHide = Component.translatable(isShow ? SBRConstants.Translation.GUI_SETTING_HIDE : SBRConstants.Translation.GUI_SETTING_SHOW); + button.setMessage(titleHide); + } catch (IOException e) { + e.printStackTrace(System.err); + } + } + + private boolean isHudShow() { + try { + return SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD").getBoolean("show", true); + } catch (IOException e) { + e.printStackTrace(System.err); + return true; + } + } + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (mouseX >= leftPos && mouseX < leftPos + imageWidth && mouseY >= topPos && mouseY < topPos + imageHeight) { @@ -110,6 +140,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { // 切换状态 isFanHudChanging = false; fanHudChangeButton.visible = true; + fanHideButton.visible = true; // 保存扇 HUD 位置 try { SinoBrush.CONFIGURATIONS.getClientConfigs().save(); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java index b047630c..64e8f7ad 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java @@ -26,7 +26,7 @@ public static void register() { } }); - RenderEvents.BEFORE_RENDER_HUD.register(args -> FanRenderer.renderInHud(args.guiGraphics())); + RenderEvents.BEFORE_RENDER_HUD.register(args -> FanRenderer.renderInHud(args.guiGraphics(), false)); RenderEvents.CUSTOM_ITEM_RENDERER.register(args -> args.register().register(new FanRenderer(), SBRItems.FAN.get())); diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java index 907c3a2c..20aadcf4 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/Configs.java @@ -30,6 +30,11 @@ public float getFloat(String key, float defaultValue) { return visitor.getFloat(key, defaultValue); } + @Override + public boolean getBoolean(String key, boolean defaultValue) { + return visitor.getBoolean(key, defaultValue); + } + @Override public IConfigVisitor getObject(String key) { return visitor.getObject(key); @@ -45,6 +50,11 @@ public void setFloat(String name, float value) { visitor.setFloat(name, value); } + @Override + public void setBoolean(String name, boolean value) { + visitor.setBoolean(name, value); + } + @Override public void save(Path path) throws IOException { visitor.save(path); diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java index a7cdb1bf..53f79bd8 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/IConfigVisitor.java @@ -9,12 +9,22 @@ public interface IConfigVisitor { float getFloat(String key, float defaultValue); + boolean getBoolean(String key, boolean defaultValue); + IConfigVisitor getObject(String key); void setInteger(String name, int value); void setFloat(String name, float value); + void setBoolean(String name, boolean value); + + default boolean flipBoolean(String name, boolean defaultValue) { + boolean newValue = !getBoolean(name, defaultValue); + setBoolean(name, newValue); + return newValue; + } + // TODO 其他类型等需要再加 void save(Path path) throws IOException; diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java index adf1fc31..657a31b1 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/utility/config/JsonVisitor.java @@ -7,7 +7,7 @@ import java.nio.file.Files; import java.nio.file.Path; -public class JsonVisitor implements IConfigVisitor { +public record JsonVisitor(JsonObject json) implements IConfigVisitor { public static JsonVisitor create(Path path) throws IOException { if (!Files.isRegularFile(path)) { @@ -18,16 +18,6 @@ public static JsonVisitor create(Path path) throws IOException { } } - private final JsonObject json; - - public JsonVisitor(JsonObject json) { - this.json = json; - } - - public JsonObject getJson() { - return json; - } - @Override public int getInteger(String key, int defaultValue) { return json.has(key) ? json.get(key).getAsInt() : defaultValue; @@ -38,6 +28,11 @@ public float getFloat(String key, float defaultValue) { return json.has(key) ? json.get(key).getAsFloat() : defaultValue; } + @Override + public boolean getBoolean(String key, boolean defaultValue) { + return json.has(key) && json.get(key).getAsBoolean(); + } + @Override public IConfigVisitor getObject(String key) { if (json.has(key)) { @@ -59,6 +54,11 @@ public void setFloat(String name, float value) { json.addProperty(name, value); } + @Override + public void setBoolean(String name, boolean value) { + json.addProperty(name, value); + } + @Override public void save(Path path) throws IOException { if (!Files.isRegularFile(path)) { From dc30be9fc03571e6e9691528c48502a86950934d Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sat, 29 Mar 2025 20:13:56 +0800 Subject: [PATCH 11/13] =?UTF-8?q?fix:=20client=20init=20=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moegirl/sinocraft/sinobrush/fabric/SinoBrushFabric.java | 6 ++++++ .../sinocraft/sinobrush/fabric/SinoBrushFabricClient.java | 1 - .../sinocraft/sinobrush/neoforge/SinoBrushNeoForge.java | 5 ++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabric.java b/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabric.java index 8ae55adf..6e43edf0 100644 --- a/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabric.java +++ b/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabric.java @@ -1,11 +1,17 @@ package games.moegirl.sinocraft.sinobrush.fabric; import games.moegirl.sinocraft.sinobrush.SinoBrush; +import games.moegirl.sinocraft.sinobrush.client.SinoBrushClient; +import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.FabricLoader; public class SinoBrushFabric implements ModInitializer { @Override public void onInitialize() { SinoBrush.init(); + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { + SinoBrushClient.initClient(); + } } } diff --git a/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabricClient.java b/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabricClient.java index f8deb2b9..32d74724 100644 --- a/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabricClient.java +++ b/sinobrush/sinobrush-fabric/src/main/java/games/moegirl/sinocraft/sinobrush/fabric/SinoBrushFabricClient.java @@ -7,7 +7,6 @@ public class SinoBrushFabricClient implements ClientModInitializer { @Override public void onInitializeClient() { - SinoBrushClient.initClient(); SinoBrushClient.setupClient(); } } diff --git a/sinobrush/sinobrush-neoforge/src/main/java/games/moegirl/sinocraft/sinobrush/neoforge/SinoBrushNeoForge.java b/sinobrush/sinobrush-neoforge/src/main/java/games/moegirl/sinocraft/sinobrush/neoforge/SinoBrushNeoForge.java index 0373f692..989ee844 100644 --- a/sinobrush/sinobrush-neoforge/src/main/java/games/moegirl/sinocraft/sinobrush/neoforge/SinoBrushNeoForge.java +++ b/sinobrush/sinobrush-neoforge/src/main/java/games/moegirl/sinocraft/sinobrush/neoforge/SinoBrushNeoForge.java @@ -6,17 +6,20 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.loading.FMLLoader; @Mod(SinoBrush.MODID) public class SinoBrushNeoForge { public SinoBrushNeoForge(IEventBus bus, ModContainer modContainer) { SinoBrush.init(); + if (FMLLoader.getDist().isClient()) { + SinoBrushClient.initClient(); + } bus.addListener(this::setupClient); } private void setupClient(FMLClientSetupEvent event) { - SinoBrushClient.initClient(); SinoBrushClient.setupClient(); } } From 271b541ca380dfa6cc4c214bdad16618ba0d0feb Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Sat, 29 Mar 2025 20:49:27 +0800 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20=E4=B8=BA=E5=95=A5=20rebase=20?= =?UTF-8?q?=E4=BC=9A=E4=B8=A2=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sinocraft/sinocore/SinoCorePlatform.java | 18 ------------------ .../args/render/CustomItemRendererArgs.java | 1 - 2 files changed, 19 deletions(-) diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java index 500f690e..a369ff2c 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/SinoCorePlatform.java @@ -1,12 +1,9 @@ package games.moegirl.sinocraft.sinocore; import dev.architectury.injectables.annotations.ExpectPlatform; -import games.moegirl.sinocraft.sinocore.data.gen.IDataGenContext; -import net.minecraft.core.HolderLookup; import net.minecraft.server.MinecraftServer; import java.nio.file.Path; -import java.util.concurrent.CompletableFuture; public class SinoCorePlatform { @@ -20,21 +17,6 @@ public static boolean isDevelopmentEnvironment() { throw new AssertionError(); } - /** - * 创建用于创建 DataProvider 对象的上下文,不同平台使用不同类型的上下文对象。其中第一个参数类型如下: - *
    - *
  • Forge: GatherDataEvent
  • - *
  • Fabric: FabricDataOutput,可以从 FabricDataGenerator.Pack 中获取
  • - *
- * - * @param platformContext 用于获取目录与 Mod 信息的上下文相关对象 - * @param registriesFuture 用于获取注册表信息的上下文对象 - */ - @ExpectPlatform - public static IDataGenContext buildDataGeneratorContext(Object platformContext, CompletableFuture registriesFuture) { - throw new AssertionError(); - } - /** * 获取配置文件目录 */ diff --git a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java index 8c3aa886..fc59c73c 100644 --- a/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java +++ b/sinocore/src/main/java/games/moegirl/sinocraft/sinocore/event/client/args/render/CustomItemRendererArgs.java @@ -6,7 +6,6 @@ public record CustomItemRendererArgs(RendererRegister register) { public interface RendererRegister { - void register(BlockEntityWithoutLevelRenderer renderer, Item... items); } } From d79987b0cceb9f65fded27ff3cf757de569463b4 Mon Sep 17 00:00:00 2001 From: luqin2007 Date: Mon, 31 Mar 2025 20:39:24 +0800 Subject: [PATCH 13/13] remove: fan hud --- .../0ef3df785a7f94cfbffdf71a30a0892f6d385df3 | 4 +- .../a8fcf7feab4b002651f8845bb8733436a9644e8d | 4 +- .../c9e6904cd53920642cfd601a942b3aed84069064 | 4 +- .../ed04c204adf5a1b37ba6904801511276adad4ec4 | 4 +- .../assets/sinobrush/lang/en_us.json | 4 - .../assets/sinobrush/lang/zh_cn.json | 4 - .../assets/sinobrush/lang/zh_hk.json | 4 - .../assets/sinobrush/lang/zh_tw.json | 4 - .../sinocraft/sinobrush/SBRConstants.java | 4 - .../sinobrush/client/FanRenderer.java | 57 --------- .../data/gen/lang/EnUsLangProvider.java | 4 - .../data/gen/lang/ZhCnLangProvider.java | 4 - .../data/gen/lang/ZhHkLangProvider.java | 4 - .../data/gen/lang/ZhTwLangProvider.java | 4 - .../sinobrush/gui/screen/FanScreen.java | 112 +----------------- .../sinobrush/handler/RenderHandlers.java | 2 - 16 files changed, 10 insertions(+), 213 deletions(-) diff --git a/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 b/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 index d96305e5..7b7bf8ec 100644 --- a/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 +++ b/sinobrush/src/generated/resources/.cache/0ef3df785a7f94cfbffdf71a30a0892f6d385df3 @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-29T18:44:09.6442439 Languages: zh_cn for mod: sinobrush -e494ae3b78926b4808e7680eb49da3988a9f4850 assets/sinobrush/lang/zh_cn.json +// 1.21.1 2025-03-31T20:36:40.5956544 Languages: zh_cn for mod: sinobrush +6703a6ffc6e71681f6d65c55cb784e22cb94850f assets/sinobrush/lang/zh_cn.json diff --git a/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d b/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d index de23e987..432bb438 100644 --- a/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d +++ b/sinobrush/src/generated/resources/.cache/a8fcf7feab4b002651f8845bb8733436a9644e8d @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-29T18:44:09.6442439 Languages: zh_hk for mod: sinobrush -731d704057a0177032afe8dd96722c30291a8f28 assets/sinobrush/lang/zh_hk.json +// 1.21.1 2025-03-31T20:36:40.5966567 Languages: zh_hk for mod: sinobrush +f3ff30daf5943879fc1a4304e7e4b7ac07684e89 assets/sinobrush/lang/zh_hk.json diff --git a/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 b/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 index 08917094..51176dca 100644 --- a/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 +++ b/sinobrush/src/generated/resources/.cache/c9e6904cd53920642cfd601a942b3aed84069064 @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-29T18:44:09.6452501 Languages: en_us for mod: sinobrush -10fddae689cf56be1d6980687273893d3410cdd8 assets/sinobrush/lang/en_us.json +// 1.21.1 2025-03-31T20:36:40.5976555 Languages: en_us for mod: sinobrush +65cd216d17e9e5917d0fafad74b16723c52b622a assets/sinobrush/lang/en_us.json diff --git a/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 b/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 index 2ab0fd51..7c3545b0 100644 --- a/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 +++ b/sinobrush/src/generated/resources/.cache/ed04c204adf5a1b37ba6904801511276adad4ec4 @@ -1,2 +1,2 @@ -// 1.21.1 2025-03-29T18:44:09.6427385 Languages: zh_tw for mod: sinobrush -a4d57c057ce283e647816253db83a3a2a516d5b0 assets/sinobrush/lang/zh_tw.json +// 1.21.1 2025-03-31T20:36:40.5946554 Languages: zh_tw for mod: sinobrush +3b79d66cd21b4c4e859c0b2bbdf380ff563ce216 assets/sinobrush/lang/zh_tw.json diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json index 2f038889..ef22ca80 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/en_us.json @@ -39,10 +39,6 @@ "sinobrush.gui.brush.tooltip_clear": "Clear the canvas", "sinobrush.gui.brush.tooltip_copy": "Left click to copy, right click to paste", "sinobrush.gui.brush.tooltip_save": "Save the canvas to an image", - "sinobrush.gui.fan.setting_hud_hint": "Drag to set position, scroll to set size.", - "sinobrush.gui.fan.setting_hud_position": "Setting HUD position", - "sinobrush.gui.setting_display": "display", - "sinobrush.gui.setting_hide": "hide", "stat.sinobrush.draw_by_brush": "Times of writing with brush", "stat.sinobrush.unfold_fan": "Times of unfolding the fan", "tag.item.sinobrush.fan": "Folding Fan", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json index a2cb029b..6758d9de 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_cn.json @@ -39,10 +39,6 @@ "sinobrush.gui.brush.tooltip_clear": "清空画布", "sinobrush.gui.brush.tooltip_copy": "左键复制,右键粘贴", "sinobrush.gui.brush.tooltip_save": "保存画布为图片", - "sinobrush.gui.fan.setting_hud_hint": "拖动调整位置,滚动滚轮调整大小", - "sinobrush.gui.fan.setting_hud_position": "设置 HUD 位置", - "sinobrush.gui.setting_display": "显示", - "sinobrush.gui.setting_hide": "隐藏", "stat.sinobrush.draw_by_brush": "作画次数", "stat.sinobrush.unfold_fan": "展开折扇次数", "tag.item.sinobrush.fan": "折扇", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json index 91a9f915..d4bbfd23 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_hk.json @@ -39,10 +39,6 @@ "sinobrush.gui.brush.tooltip_clear": "清空畫布", "sinobrush.gui.brush.tooltip_copy": "左鍵複製,右鍵黏貼", "sinobrush.gui.brush.tooltip_save": "保存畫布為圖片", - "sinobrush.gui.fan.setting_hud_hint": "拖動調整位置,滾動滾輪調整大小", - "sinobrush.gui.fan.setting_hud_position": "設定 HUD 位置", - "sinobrush.gui.setting_display": "顯示", - "sinobrush.gui.setting_hide": "隱藏", "stat.sinobrush.draw_by_brush": "作畫次數", "stat.sinobrush.unfold_fan": "展開摺扇次數", "tag.item.sinobrush.fan": "摺扇", diff --git a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json index 76d230cc..1b2fb4c9 100644 --- a/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json +++ b/sinobrush/src/generated/resources/assets/sinobrush/lang/zh_tw.json @@ -39,10 +39,6 @@ "sinobrush.gui.brush.tooltip_clear": "清空畫布", "sinobrush.gui.brush.tooltip_copy": "左鍵複製,右鍵黏貼", "sinobrush.gui.brush.tooltip_save": "保存畫布為圖片", - "sinobrush.gui.fan.setting_hud_hint": "拖動調整位置,滾動滾輪調整大小", - "sinobrush.gui.fan.setting_hud_position": "設定 HUD 位置", - "sinobrush.gui.setting_display": "顯示", - "sinobrush.gui.setting_hide": "隱藏", "stat.sinobrush.draw_by_brush": "作畫次數", "stat.sinobrush.unfold_fan": "展開摺扇次數", "tag.item.sinobrush.fan": "摺扇", diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java index acf23606..a5cf36d0 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/SBRConstants.java @@ -66,10 +66,6 @@ public static class Translation { public static final String GUI_BRUSH_SAVE_FAILED_NO_PAPER = "sinobrush.gui.brush.save_failed_no_paper"; public static final String GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED = "sinobrush.gui.brush.save_failed_output_occupied"; public static final String GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND = "sinobrush.gui.brush.save_failed_no_brush_on_hand"; - public static final String GUI_FAN_SETTING_HUD_POSITION = "sinobrush.gui.fan.setting_hud_position"; - public static final String GUI_FAN_SETTING_HUD_HINT = "sinobrush.gui.fan.setting_hud_hint"; - public static final String GUI_SETTING_HIDE = "sinobrush.gui.setting_hide"; - public static final String GUI_SETTING_SHOW = "sinobrush.gui.setting_display"; public static final String ADVANCEMENT_ROOT_NAME = "sinobrush.advancement.root.name"; public static final String ADVANCEMENT_ROOT_DESC = "sinobrush.advancement.root.desc"; diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java index f7ea0370..4207a7f1 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/client/FanRenderer.java @@ -7,13 +7,10 @@ import games.moegirl.sinocraft.sinocore.gui.widgets.WidgetLoader; import games.moegirl.sinocraft.sinocore.gui.widgets.Widgets; import games.moegirl.sinocraft.sinocore.gui.widgets.entry.TextureEntry; -import games.moegirl.sinocraft.sinocore.utility.config.Configs; -import games.moegirl.sinocraft.sinocore.utility.config.IConfigVisitor; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransform; @@ -22,14 +19,11 @@ import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import org.apache.logging.log4j.util.Lazy; import org.joml.Matrix4f; -import java.io.IOException; import java.util.EnumSet; import java.util.List; @@ -147,55 +141,4 @@ private static int drawCharactersInGui(GuiGraphics guiGraphics, Font font, Strin } return y; } - - public static void renderInHud(GuiGraphics guiGraphics, boolean mustShow) { - LocalPlayer player = Minecraft.getInstance().player; - if (player != null) { - ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); - if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, stack, mustShow); - return; - } - - stack = player.getItemInHand(InteractionHand.OFF_HAND); - if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, stack, mustShow); - return; - } - - Inventory inventory = player.getInventory(); - for (int i = 0; i < 9; i++) { - stack = inventory.getItem(i); - if (stack.is(SBRItems.FAN.get())) { - renderInHud(guiGraphics, stack, mustShow); - return; - } - } - } - } - - public static void renderInHud(GuiGraphics guiGraphics, ItemStack stack, boolean mustShow) { - int x = 0, y = 0; - float scale = 0.5f; - try { - Configs clientConfigs = SinoBrush.CONFIGURATIONS.getClientConfigs(); - IConfigVisitor fanHud = clientConfigs.getObject("FanHUD"); - x = fanHud.getInteger("x", 0); - y = fanHud.getInteger("y", 0); - scale = fanHud.getFloat("scale", 0.5f); - mustShow |= fanHud.getBoolean("show", true); - } catch (IOException e) { - e.printStackTrace(System.err); - } - - if (mustShow) { - List lines = FanItem.getLines(stack); - PoseStack pose = guiGraphics.pose(); - pose.pushPose(); - pose.translate(x, y, 0); - pose.scale(scale, scale, 1); - renderInGui(guiGraphics, Minecraft.getInstance().font, 0, 0, lines, -1, 0); - pose.popPose(); - } - } } diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java index 5f8ac4aa..37cf7c6f 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/EnUsLangProvider.java @@ -55,10 +55,6 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "Sign failed: No paper provided"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "Sign failed: Take the previous calligraphy first"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "Sign failed: Why you want write without a writing brush?"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "Setting HUD position"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "Drag to set position, scroll to set size."); - delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "hide"); - delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "display"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "SinoBrush"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "Painting Lives by Brush, Writing Elegance in Ink."); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java index 137a3bc5..8c2e33c6 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhCnLangProvider.java @@ -55,10 +55,6 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "落款失败:找不到宣纸"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "落款失败:请取走之前的作品"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失败:不用笔画画,你是怎么做到的?"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "设置 HUD 位置"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖动调整位置,滚动滚轮调整大小"); - delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "隐藏"); - delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "显示"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "华夏云墨"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "丹青描绘浮生,云墨书尽芳华"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java index 5ac030de..7cfe7519 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhHkLangProvider.java @@ -55,10 +55,6 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "落款失敗:找不到宣紙"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "落款失敗:請取走之前的作品"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失敗:不用筆畫畫,你是怎麼做到的?"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "設定 HUD 位置"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖動調整位置,滾動滾輪調整大小"); - delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "隱藏"); - delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "顯示"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "丹青描繪浮生,雲墨書盡芳華"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "歡迎遊玩《華夏雲墨》"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java index e1f7cc72..05b45868 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/data/gen/lang/ZhTwLangProvider.java @@ -55,10 +55,6 @@ public void generateData(LanguageProviderDelegateBase delegate) { delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_PAPER, "落款失敗:找不到宣紙"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_OUTPUT_OCCUPIED, "落款失敗:請取走之前的作品"); delegate.add(SBRConstants.Translation.GUI_BRUSH_SAVE_FAILED_NO_BRUSH_ON_HAND, "落款失敗:不用筆畫畫,你是怎麼做到的?"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION, "設定 HUD 位置"); - delegate.add(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT, "拖動調整位置,滾動滾輪調整大小"); - delegate.add(SBRConstants.Translation.GUI_SETTING_HIDE, "隱藏"); - delegate.add(SBRConstants.Translation.GUI_SETTING_SHOW, "顯示"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_NAME, "丹青描繪浮生,雲墨書盡芳華"); delegate.add(SBRConstants.Translation.ADVANCEMENT_ROOT_DESC, "歡迎遊玩《華夏雲墨》"); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java index 64564dd3..7cd1102f 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/gui/screen/FanScreen.java @@ -1,19 +1,14 @@ package games.moegirl.sinocraft.sinobrush.gui.screen; -import games.moegirl.sinocraft.sinobrush.SBRConstants; import games.moegirl.sinocraft.sinobrush.SinoBrush; import games.moegirl.sinocraft.sinobrush.client.FanRenderer; import games.moegirl.sinocraft.sinobrush.network.Common2FanLines; import games.moegirl.sinocraft.sinocore.gui.widgets.entry.TextureEntry; import games.moegirl.sinocraft.sinocore.network.NetworkManager; -import games.moegirl.sinocraft.sinocore.utility.config.Configs; -import games.moegirl.sinocraft.sinocore.utility.config.IConfigVisitor; import net.minecraft.Util; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import org.lwjgl.glfw.GLFW; import java.io.IOException; @@ -31,9 +26,6 @@ public class FanScreen extends Screen { private int currentLine = -1; private long focusedTime = 0; private boolean isChanged = false; - private Button fanHudChangeButton; - private boolean isFanHudChanging = false; - private Button fanHideButton; public FanScreen(List lines) { super(Component.literal("fan")); @@ -47,39 +39,12 @@ public FanScreen(List lines) { protected void init() { this.leftPos = (this.width - this.imageWidth) / 2; this.topPos = (this.height - this.imageHeight) / 2; - - Component titlePosition = Component.translatable(SBRConstants.Translation.GUI_FAN_SETTING_HUD_POSITION); - Component titleHide = Component.translatable(isHudShow() ? SBRConstants.Translation.GUI_SETTING_HIDE : SBRConstants.Translation.GUI_SETTING_SHOW); - int btnWidth = font.width(titlePosition) + 20; - if (fanHudChangeButton == null) { - fanHudChangeButton = Button.builder(titlePosition, this::setHudPosition) - .pos(leftPos + imageWidth - btnWidth, topPos + imageHeight - 20) - .size(btnWidth, 20) - .build(); - addRenderableWidget(fanHudChangeButton); - fanHideButton = Button.builder(titleHide, this::setHudHide) - .pos(leftPos + imageWidth - btnWidth, topPos + imageHeight - 40) - .size(btnWidth, 20) - .build(); - addRenderableWidget(fanHideButton); - } else { - fanHudChangeButton.setPosition(leftPos + imageWidth - btnWidth, topPos + imageHeight - 20); - fanHideButton.setPosition(leftPos + imageWidth - btnWidth, topPos + imageHeight - 40); - } } @Override public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { super.render(guiGraphics, mouseX, mouseY, partialTick); - if (isFanHudChanging) { - FanRenderer.renderInHud(guiGraphics, true); - MutableComponent hint = Component.translatable(SBRConstants.Translation.GUI_FAN_SETTING_HUD_HINT); - int tw = font.width(hint); - int th = font.wordWrapHeight(hint, tw); - guiGraphics.drawString(font, hint, leftPos + imageWidth / 2 - tw / 2, topPos + imageHeight - th, 0xFFFFFF); - } else { - FanRenderer.renderInGui(guiGraphics, font, leftPos, topPos, lines, currentLine, focusedTime); - } + FanRenderer.renderInGui(guiGraphics, font, leftPos, topPos, lines, currentLine, focusedTime); } private void moveCursorLeft() { @@ -94,32 +59,6 @@ private void moveCursorRight() { } } - private void setHudPosition(Button button) { - button.visible = false; - fanHideButton.visible = false; - isFanHudChanging = true; - } - - private void setHudHide(Button button) { - try { - IConfigVisitor configs = SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD"); - boolean isShow = configs.flipBoolean("show", true); - Component titleHide = Component.translatable(isShow ? SBRConstants.Translation.GUI_SETTING_HIDE : SBRConstants.Translation.GUI_SETTING_SHOW); - button.setMessage(titleHide); - } catch (IOException e) { - e.printStackTrace(System.err); - } - } - - private boolean isHudShow() { - try { - return SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD").getBoolean("show", true); - } catch (IOException e) { - e.printStackTrace(System.err); - return true; - } - } - @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (mouseX >= leftPos && mouseX < leftPos + imageWidth && mouseY >= topPos && mouseY < topPos + imageHeight) { @@ -136,19 +75,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_ESCAPE) { - if (isFanHudChanging) { - // 切换状态 - isFanHudChanging = false; - fanHudChangeButton.visible = true; - fanHideButton.visible = true; - // 保存扇 HUD 位置 - try { - SinoBrush.CONFIGURATIONS.getClientConfigs().save(); - } catch (IOException e) { - e.printStackTrace(System.err); - } - return true; - } else if (currentLine != -1) { + if (currentLine != -1) { currentLine = -1; return true; } @@ -194,41 +121,6 @@ public boolean charTyped(char codePoint, int modifiers) { return super.charTyped(codePoint, modifiers); } - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { - if (isFanHudChanging) { - try { - IConfigVisitor configs = SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD"); - float ds = scrollY > 0 ? 0.05f : -0.05f; - float scale = configs.getFloat("scale", 0.5f) + ds; - scale = Math.max(0.05f, scale); - configs.setFloat("scale", scale); - return true; - } catch (IOException e) { - e.printStackTrace(System.err); - } - } - return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); - } - - @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { - if (isFanHudChanging) { - try { - IConfigVisitor configs = SinoBrush.CONFIGURATIONS.getClientConfigs().getObject("FanHUD"); - int x = configs.getInteger("x", 0) + (int) dragX; - int y = configs.getInteger("y", 0) + (int) dragY; - configs.setInteger("x", x); - configs.setInteger("y", y); - return true; - } catch (IOException e) { - e.printStackTrace(System.err); - } - return true; - } - return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); - } - private Component getComponentAt(int i) { for (int j = lines.size(); j <= i; j++) { lines.add(Component.empty()); diff --git a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java index 64e8f7ad..d2457e2b 100644 --- a/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java +++ b/sinobrush/src/main/java/games/moegirl/sinocraft/sinobrush/handler/RenderHandlers.java @@ -26,8 +26,6 @@ public static void register() { } }); - RenderEvents.BEFORE_RENDER_HUD.register(args -> FanRenderer.renderInHud(args.guiGraphics(), false)); - RenderEvents.CUSTOM_ITEM_RENDERER.register(args -> args.register().register(new FanRenderer(), SBRItems.FAN.get()));