This commit is contained in:
Coloryr committed 2026-11-02 23:27:12 +08:00
1 parent 1b91c623a1
commit 4c83a39bff
6 files changed
+69 -31

No files matched your search

@@ -3,14 +3,14 @@ package com.coloryr.allmusic.client;
import com.coloryr.allmusic.client.core.AllMusicCore;
import com.coloryr.allmusic.client.core.CommandMusicClient;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.ClientCommands;
/**
* Fabric(1.19.3+)的 /music_client 指令壳
* Fabric(1.21.11+ / 26.x)的 /music_client 指令壳
* <p>
* 只负责注册指令(包括 Tab 补全用的子指令节点),具体逻辑都在通用的 {@link CommandMusicClient} 里。
* 注意这里必须用 ClientCommandManager 建节点,客户端指令的 source 是 FabricClientCommandSource
* 新版本 fabric-api 用 {@link ClientCommands} 取代了 ClientCommandManager。
* 只负责注册指令(包括 Tab 补全用的子指令节点),具体逻辑都在通用的 {@link CommandMusicClient} 里
*/
public final class CommandMusicClientFabric {
private CommandMusicClientFabric() {
@@ -18,17 +18,17 @@ public final class CommandMusicClientFabric {
public static void register() {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) ->
dispatcher.register(ClientCommandManager.literal(CommandMusicClient.NAME)
dispatcher.register(ClientCommands.literal(CommandMusicClient.NAME)
.executes(context -> CommandMusicClient.run(new String[0]))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_HELP)
.then(ClientCommands.literal(CommandMusicClient.ARG_HELP)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_HELP})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_INFO)
.then(ClientCommands.literal(CommandMusicClient.ARG_INFO)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_INFO})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_TEST)
.then(ClientCommands.literal(CommandMusicClient.ARG_TEST)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_TEST})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_IMAGE_SIZE)
.then(ClientCommands.literal(CommandMusicClient.ARG_IMAGE_SIZE)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_IMAGE_SIZE}))
.then(ClientCommandManager.argument("size", IntegerArgumentType.integer(AllMusicCore.MIN_PIC_SIZE, AllMusicCore.MAX_PIC_SIZE))
.then(ClientCommands.argument("size", IntegerArgumentType.integer(AllMusicCore.MIN_PIC_SIZE, AllMusicCore.MAX_PIC_SIZE))
.executes(context -> CommandMusicClient.run(new String[]{
CommandMusicClient.ARG_IMAGE_SIZE,
Integer.toString(IntegerArgumentType.getInteger(context, "size"))}))))));
@@ -3,14 +3,14 @@ package com.coloryr.allmusic.client;
import com.coloryr.allmusic.client.core.AllMusicCore;
import com.coloryr.allmusic.client.core.CommandMusicClient;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.ClientCommands;
/**
* Fabric(1.19.3+)的 /music_client 指令壳
* Fabric(1.21.11+ / 26.x)的 /music_client 指令壳
* <p>
* 只负责注册指令(包括 Tab 补全用的子指令节点),具体逻辑都在通用的 {@link CommandMusicClient} 里。
* 注意这里必须用 ClientCommandManager 建节点,客户端指令的 source 是 FabricClientCommandSource
* 新版本 fabric-api 用 {@link ClientCommands} 取代了 ClientCommandManager。
* 只负责注册指令(包括 Tab 补全用的子指令节点),具体逻辑都在通用的 {@link CommandMusicClient} 里
*/
public final class CommandMusicClientFabric {
private CommandMusicClientFabric() {
@@ -18,17 +18,17 @@ public final class CommandMusicClientFabric {
public static void register() {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) ->
dispatcher.register(ClientCommandManager.literal(CommandMusicClient.NAME)
dispatcher.register(ClientCommands.literal(CommandMusicClient.NAME)
.executes(context -> CommandMusicClient.run(new String[0]))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_HELP)
.then(ClientCommands.literal(CommandMusicClient.ARG_HELP)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_HELP})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_INFO)
.then(ClientCommands.literal(CommandMusicClient.ARG_INFO)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_INFO})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_TEST)
.then(ClientCommands.literal(CommandMusicClient.ARG_TEST)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_TEST})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_IMAGE_SIZE)
.then(ClientCommands.literal(CommandMusicClient.ARG_IMAGE_SIZE)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_IMAGE_SIZE}))
.then(ClientCommandManager.argument("size", IntegerArgumentType.integer(AllMusicCore.MIN_PIC_SIZE, AllMusicCore.MAX_PIC_SIZE))
.then(ClientCommands.argument("size", IntegerArgumentType.integer(AllMusicCore.MIN_PIC_SIZE, AllMusicCore.MAX_PIC_SIZE))
.executes(context -> CommandMusicClient.run(new String[]{
CommandMusicClient.ARG_IMAGE_SIZE,
Integer.toString(IntegerArgumentType.getInteger(context, "size"))}))))));
@@ -3,14 +3,14 @@ package com.coloryr.allmusic.client;
import com.coloryr.allmusic.client.core.AllMusicCore;
import com.coloryr.allmusic.client.core.CommandMusicClient;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.ClientCommands;
/**
* Fabric(1.19.3+)的 /music_client 指令壳
* Fabric(1.21.11+ / 26.x)的 /music_client 指令壳
* <p>
* 只负责注册指令(包括 Tab 补全用的子指令节点),具体逻辑都在通用的 {@link CommandMusicClient} 里。
* 注意这里必须用 ClientCommandManager 建节点,客户端指令的 source 是 FabricClientCommandSource
* 新版本 fabric-api 用 {@link ClientCommands} 取代了 ClientCommandManager。
* 只负责注册指令(包括 Tab 补全用的子指令节点),具体逻辑都在通用的 {@link CommandMusicClient} 里
*/
public final class CommandMusicClientFabric {
private CommandMusicClientFabric() {
@@ -18,17 +18,17 @@ public final class CommandMusicClientFabric {
public static void register() {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) ->
dispatcher.register(ClientCommandManager.literal(CommandMusicClient.NAME)
dispatcher.register(ClientCommands.literal(CommandMusicClient.NAME)
.executes(context -> CommandMusicClient.run(new String[0]))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_HELP)
.then(ClientCommands.literal(CommandMusicClient.ARG_HELP)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_HELP})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_INFO)
.then(ClientCommands.literal(CommandMusicClient.ARG_INFO)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_INFO})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_TEST)
.then(ClientCommands.literal(CommandMusicClient.ARG_TEST)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_TEST})))
.then(ClientCommandManager.literal(CommandMusicClient.ARG_IMAGE_SIZE)
.then(ClientCommands.literal(CommandMusicClient.ARG_IMAGE_SIZE)
.executes(context -> CommandMusicClient.run(new String[]{CommandMusicClient.ARG_IMAGE_SIZE}))
.then(ClientCommandManager.argument("size", IntegerArgumentType.integer(AllMusicCore.MIN_PIC_SIZE, AllMusicCore.MAX_PIC_SIZE))
.then(ClientCommands.argument("size", IntegerArgumentType.integer(AllMusicCore.MIN_PIC_SIZE, AllMusicCore.MAX_PIC_SIZE))
.executes(context -> CommandMusicClient.run(new String[]{
CommandMusicClient.ARG_IMAGE_SIZE,
Integer.toString(IntegerArgumentType.getInteger(context, "size"))}))))));
@@ -27,6 +27,12 @@ public class PicRender extends PictureFrameBuffer {
rotateTexture = new DynamicTexture(size, size, false);
}
@Override
public void dispose() {
sourceTexture.releaseId();
rotateTexture.releaseId();
}
@Override
public void update(byte[] source, byte[] rotate) {
try {
@@ -134,7 +134,8 @@ public class TexRender extends TextureRender {
float y1 = h1;
float z = 0;
float u0 = 0;
float u1 = width;
// 整张贴图铺满整个四边形,U/V 必须是 0~1,不能写成 width,否则底图会被横向平铺/拉伸
float u1 = 1;
float v0 = 0;
float v1 = 1;
@@ -1,6 +1,7 @@
package com.coloryr.allmusic.client.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
@@ -108,6 +109,36 @@ public class CommandMusicClient {
return 1;
}
/**
* 处理一条聊天栏输入
* <p>
* 没有客户端指令 API 的版本(比如 1.16.5 Forge)在拦截「发送聊天/指令」时调用这里,
* 命中 {@code /music_client} 就本地处理并返回 true,调用方把这条消息吞掉即可
*
* @param message 原始输入,例如 {@code /music_client imagesize 128}
* @return 是否已处理(true 表示不要发给服务端)
*/
public static boolean handleChat(String message) {
if (message == null) {
return false;
}
String text = message.trim();
if (!text.startsWith("/")) {
return false;
}
String[] parts = text.substring(1).trim().split("\\s+");
if (parts.length == 0 || parts[0].isEmpty() || !NAME.equalsIgnoreCase(parts[0])) {
return false;
}
String[] args = parts.length > 1 ? Arrays.copyOfRange(parts, 1, parts.length) : new String[0];
run(args);
return true;
}
/**
* 输出行的样式,方便各版本上色
*