This commit is contained in:
Coloryr committed 2026-11-02 17:24:31 +08:00
1 parent 4e8058193f
commit 4560231e3e
17 files changed
+270 -75

No files matched your search

+3 -1
View File
@@ -26,4 +26,6 @@ forge*changelog.txt
lib/
target/
.DS_Store
.DS_Store
/.tmp_bc
/.tmp_rfg
+1
View File
@@ -85,6 +85,7 @@ AllMusic不会内置音乐api,你想要正常使用需要自己安装
- mutePlayMessage 是否不发送播放信息
- muteAddMessage 是否不发送点歌信息
- showInBar 是否将信息限制在bar处
- showClick 是否显示[点我]操作,1.7.10客户端不支持点击事件,可设为false关闭
- ktvMode 是否启用KTV歌词
- musicBR 歌曲音质
- version 配置文件版本号
+1 -1
View File
@@ -12,7 +12,7 @@ allprojects {
apply(plugin = "com.gradleup.shadow")
group = "com.coloryr"
version = "4.2.8"
version = "4.2.9"
// 设置项目JDK版本
java.sourceCompatibility = JavaVersion.VERSION_1_8
+1 -1
View File
@@ -22,7 +22,7 @@ dependencies {
tasks {
processResources {
filesMatching("META-INF/mods.toml") {
filesMatching("mcmod.info") {
expand("version" to project.version)
}
}
@@ -3,6 +3,8 @@ package com.coloryr.allmusic.client;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.nio.IntBuffer;
import java.util.List;
import com.coloryr.allmusic.client.core.AllMusicBridge;
@@ -44,7 +46,7 @@ import paulscode.sound.Library;
import paulscode.sound.SoundSystem;
import paulscode.sound.libraries.ChannelLWJGLOpenAL;
@Mod(modid = "allmusic_client", version = "3.1.1", name = "AllMusic_Client", acceptedMinecraftVersions = "[1.7.10]")
@Mod(modid = "allmusic_client", version = "4.2.8", name = "AllMusic_Client", acceptedMinecraftVersions = "[1.7.10]")
@SideOnly(Side.CLIENT)
public class AllMusic implements AllMusicBridge {
public static final Logger LOGGER = LogManager.getLogger("AllMusic Client");
@@ -72,14 +74,121 @@ public class AllMusic implements AllMusicBridge {
public void test(final FMLLoadCompleteEvent event) {
Minecraft.getMinecraft().getSoundHandler();
Library library = ((IGetSoundHandler) sound).allMusic_Client$getSoundLibrary();
IGetSound sound1 = (IGetSound) library;
List<Channel> list = sound1.allMusic_Client$getStreamingChannels();
ChannelLWJGLOpenAL channel = (ChannelLWJGLOpenAL) list.get(list.size() - 1);
AllMusicCore.init(new File("config").toPath(), this, channel.ALSource);
IntBuffer source = findOpenAlSource();
AllMusicCore.init(new File("config").toPath(), this, source);
AllMusicCore.renderInit();
}
/**
* 获取 Minecraft 的 OpenAL 音频源
* <p>
* 优先走 Mixin 注入的接口;Mixin 没生效(例如没有加载 mixins.allmusic_client.json)时,
* 通过反射从 SoundSystem -> Library -> streamingChannels 里取,保证不影响核心初始化
*/
private static IntBuffer findOpenAlSource() {
try {
Library library = ((IGetSoundHandler) sound).allMusic_Client$getSoundLibrary();
IGetSound sound1 = (IGetSound) library;
List<Channel> list = sound1.allMusic_Client$getStreamingChannels();
ChannelLWJGLOpenAL channel = (ChannelLWJGLOpenAL) list.get(list.size() - 1);
return channel.ALSource;
} catch (Throwable ignored) {
}
try {
SoundSystem soundSystem = findSoundSystem();
if (soundSystem == null) {
LOGGER.warn("[AllMusic Client] 未找到 SoundSystem,音乐将尝试使用独立音频源");
return null;
}
Library library = findFieldObject(soundSystem, Library.class);
if (library == null) {
LOGGER.warn("[AllMusic Client] 未找到 SoundLibrary,音乐将尝试使用独立音频源");
return null;
}
IntBuffer source = findStreamingSource(library);
if (source == null) {
LOGGER.warn("[AllMusic Client] 未找到流式音频声道,音乐将尝试使用独立音频源");
}
return source;
} catch (Throwable e) {
LOGGER.warn("[AllMusic Client] 反射获取音频源失败,音乐将尝试使用独立音频源", e);
return null;
}
}
/**
* 从 SoundHandler 里找到 SoundSystem(paulscode 的类名不会被混淆,可以按类型查找)
*/
private static SoundSystem findSoundSystem() throws Exception {
Object handler = Minecraft.getMinecraft().getSoundHandler();
if (handler == null) {
return null;
}
for (Class<?> clazz = handler.getClass(); clazz != null && clazz != Object.class; clazz = clazz.getSuperclass()) {
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
Object value = field.get(handler);
if (value == null) {
continue;
}
SoundSystem soundSystem = findFieldObject(value, SoundSystem.class);
if (soundSystem != null) {
return soundSystem;
}
}
}
return null;
}
/**
* 在对象的字段(含父类)里查找指定类型的值
*/
private static <T> T findFieldObject(Object owner, Class<T> type) throws Exception {
for (Class<?> clazz = owner.getClass(); clazz != null && clazz != Object.class; clazz = clazz.getSuperclass()) {
for (Field field : clazz.getDeclaredFields()) {
if (!type.isAssignableFrom(field.getType())) {
continue;
}
field.setAccessible(true);
Object value = field.get(owner);
if (type.isInstance(value)) {
return type.cast(value);
}
}
}
return null;
}
/**
* 取最后一个流式声道的 OpenAL source
*/
private static IntBuffer findStreamingSource(Library library) throws Exception {
for (Class<?> clazz = library.getClass(); clazz != null && clazz != Object.class; clazz = clazz.getSuperclass()) {
for (Field field : clazz.getDeclaredFields()) {
if (!List.class.isAssignableFrom(field.getType())) {
continue;
}
field.setAccessible(true);
Object value = field.get(library);
if (!(value instanceof List)) {
continue;
}
List<?> channels = (List<?>) value;
for (int i = channels.size() - 1; i >= 0; i--) {
Object channel = channels.get(i);
if (channel instanceof ChannelLWJGLOpenAL) {
IntBuffer source = ((ChannelLWJGLOpenAL) channel).ALSource;
if (source != null) {
return source;
}
}
}
}
}
return null;
}
@Mod.EventHandler
public void preload(final FMLPreInitializationEvent evt) {
MinecraftForge.EVENT_BUS.register(this);
@@ -210,7 +210,12 @@ public class AllMusicCore {
* @param buffer 数据包
*/
public static void packRead(ByteBuf buffer) {
packDo(MusicPacketCodec.decode(buffer));
if (buffer == null || !buffer.isReadable()) {
return;
}
// 1.7.10 的 FML 会把原始 payload 直接交给监听器,且 decode 会修改 buffer 的下标,
// 这里复制一份再解析,避免影响其他监听器/FML 自身对同一个 buffer 的使用
packDo(MusicPacketCodec.decode(buffer.copy()));
}
/**
@@ -15,6 +15,29 @@ public class MusicPacketCodec {
return buf;
}
/**
* 打包成精确长度的字节数组
* <p>
* {@link #pack(MusicPack)} 返回的 ByteBuf 容量是 Netty 扩容后的值(最小 64,之后按 2 倍增长),
* 通常大于实际写入的长度。直接发送 {@code array()} 会带上大量 0 字节;
* 1.7.x 客户端的自定义数据包长度是一个 VarShort,代理会按整个数组长度来写,
* 数据被撑大后可能超过 32767 的上限,导致客户端收不到数据包。
* 因此这里只复制真正写入的字节。
*
* @param pack 数据
* @return 精确长度的数据
*/
public static byte[] packBytes(MusicPack pack) {
ByteBuf buf = pack(pack);
try {
byte[] data = new byte[buf.readableBytes()];
buf.readBytes(data);
return data;
} finally {
buf.release();
}
}
public static void pack(ByteBuf buf, MusicPack pack) {
buf.writeByte(pack.type.ordinal());
switch (pack.type) {
@@ -12,7 +12,6 @@ import com.coloryr.allmusic.server.event.MusicAddEvent;
import com.coloryr.allmusic.server.event.MusicPlayEvent;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import io.netty.buffer.ByteBuf;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.minimessage.MiniMessage;
@@ -169,7 +168,7 @@ public class SideBungee extends BaseSide implements IEconomy {
@Override
public void send(Object player, MusicPack pack) {
if (player instanceof ProxiedPlayer) {
send((ProxiedPlayer) player, MusicPacketCodec.pack(pack));
send((ProxiedPlayer) player, MusicPacketCodec.packBytes(pack));
}
}
@@ -278,11 +277,16 @@ public class SideBungee extends BaseSide implements IEconomy {
}
}
private void send(ProxiedPlayer player, ByteBuf data) {
if (player == null) {
private void send(ProxiedPlayer player, byte[] data) {
if (player == null || data == null || data.length == 0) {
return;
}
runTask(() -> player.sendData(AllMusic.channel, data.array()));
try {
runTask(() -> player.sendData(AllMusic.channel, data));
} catch (Exception e) {
AllMusic.log.data("<light_purple>[AllMusic]<red>数据发送发生错误");
e.printStackTrace();
}
}
private boolean skip(ProxiedPlayer player) {
@@ -148,7 +148,7 @@ public class SideFolia extends BaseSide {
public void send(Object player, MusicPack pack) {
if (AllMusic.isRun && player instanceof Player player1) {
runTask(() -> player1.sendPluginMessage(AllMusicFolia.plugin, AllMusic.channel,
MusicPacketCodec.pack(pack).array()));
MusicPacketCodec.packBytes(pack)));
}
}
@@ -68,7 +68,7 @@ public class SidePaper extends BaseSide {
public void send(Object player, MusicPack pack) {
if (player instanceof Player player1) {
try {
send(player1, MusicPacketCodec.pack(pack).array());
send(player1, MusicPacketCodec.packBytes(pack));
} catch (Exception e) {
e.printStackTrace();
}
@@ -70,7 +70,7 @@ public class SideBukkit extends BaseSide {
if (player instanceof Player) {
Player player1 = (Player) player;
try {
send(player1, MusicPacketCodec.pack(pack).array());
send(player1, MusicPacketCodec.packBytes(pack));
} catch (Exception e) {
e.printStackTrace();
}
@@ -9,96 +9,96 @@ public class CommandHelp extends ACommand {
public void execute(Object sender, String name, String[] args) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().help.normal.head);
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.base)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.stop)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music stop")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music stop")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.list)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music list")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music list")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.cancel)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music cancel")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music cancel")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.vote)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music vote")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music vote")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.vote1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music vote cancel")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music vote cancel")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.push)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickRun, "/music push ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickRun, "/music push ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.push1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music push cancel")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music push cancel")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.vote)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music vote")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music vote")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.mute)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music mute")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music mute")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.mutelist)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music mute list")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music mute list")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.search)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music search ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music search ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.select)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music select ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music select ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.nextpage)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music nextpage")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music nextpage")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.lastpage)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music lastpage")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music lastpage")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud9)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music hud enable")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music hud enable")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud10)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music hud reset")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music hud reset")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud1)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud2)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud6)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud7)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud8)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud11)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud12)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud13)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud14)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud3)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud pic size ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud pic size ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud4)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud pic rotate ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud pic rotate ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.hud5)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music hud pic speed ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music hud pic speed ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.join)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music join")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music join")));
if (AllMusic.side.checkPermission(sender)) {
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.reload)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music reload")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music reload")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.next)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music next")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music next")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.ban)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music ban ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music ban ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.ban1)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music ban ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music ban ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.banPlayer)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music banplayer ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music banplayer ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.unban)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music unban ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music unban ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.unbanPlayer)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music unbanplayer ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music unbanplayer ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.delete)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music delete ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music delete ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.addList)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music addlist ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music addlist ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.addList1)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music addlist ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music addlist ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.clearList)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music clearlist")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music clearlist")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.clearBanList)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music clearban")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music clearban")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.clearBanPlayerList)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music clearbanplayer")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music clearbanplayer")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.test)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music test ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music test ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.admin.test1)
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickCheck, "/music test ")));
.append(AllMusic.side.clickSuggest(AllMusic.getMessage().click.clickCheck, "/music test ")));
}
}
}
@@ -75,7 +75,7 @@ public class MusicSearch {
AllMusic.side.sendMessage(sender, "");
if (search.haveLastPage()) {
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().search.lastPage)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().page.last, "/music lastpage")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().page.last, "/music lastpage")));
}
for (int a = 0; a < index; a++) {
item = search.getRes(a + search.getPage() * 10);
@@ -85,11 +85,11 @@ public class MusicSearch {
.replace(ARG.musicAuthor, item.author)
.replace(ARG.musicAl, item.al);
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(info)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music select " + (a + 1))));
.append(AllMusic.side.clickRun(AllMusic.getMessage().click.clickRun, "/music select " + (a + 1))));
}
if (search.haveNextPage()) {
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().search.nextPage)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().page.next, "/music nextpage")));
.append(AllMusic.side.clickRun(AllMusic.getMessage().page.next, "/music nextpage")));
}
AllMusic.side.sendMessage(sender, "");
}
@@ -192,8 +192,10 @@ public class PlayRuntime {
.replace(ARG.time, String.valueOf(AllMusic.getConfig().vote.voteTime))
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().vote.bq1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().vote.bq2, "/music agree")));
if (AllMusic.getConfig().isShowClick()) {
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().vote.bq1)
.append(AllMusic.side.clickRun(AllMusic.getMessage().vote.bq2, "/music agree")));
}
} else if (vote.getType() == VoteItem.VoteType.PUSH) {
SongInfoObj music = PlayMusic.getMusic(vote.getId(), vote.getApi());
if (music == null) {
@@ -208,8 +210,10 @@ public class PlayRuntime {
.replace(ARG.musicAuthor, music.getAuthor())
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().push.bq1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().push.bq2, "/music agree")));
if (AllMusic.getConfig().isShowClick()) {
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().push.bq1)
.append(AllMusic.side.clickRun(AllMusic.getMessage().push.bq2, "/music agree")));
}
}
}
}
@@ -63,6 +63,10 @@ public class ConfigObj {
* 将信息显示在bar处
*/
public boolean showInBar;
/**
* 是否显示[点我]操作,1.7.10客户端不支持点击事件
*/
public Boolean showClick;
/**
* K歌歌词
*/
@@ -112,6 +116,17 @@ public class ConfigObj {
*/
public int fixSongTime;
/**
* 是否显示[点我]操作
* <p>
* 老配置文件里没有这个字段时,默认显示
*
* @return 是否显示
*/
public boolean isShowClick() {
return showClick == null || showClick;
}
public static ConfigObj make() {
ConfigObj config = new ConfigObj();
config.init();
@@ -165,6 +180,7 @@ public class ConfigObj {
mutePlayMessage = false;
muteAddMessage = false;
showInBar = false;
showClick = true;
defaultAddMusic = 0;
defaultApi = "netapi";
topAPI = false;
@@ -588,6 +588,38 @@ public abstract class BaseSide {
public abstract Component miniMessageSuggest(String input, String command);
/**
* 构建可点击执行指令的文本
* <p>
* 配置关闭 showClick 后返回空内容,因为1.7.10客户端不支持点击事件
*
* @param input 显示文本
* @param command 执行的指令
* @return 文本
*/
public final Component clickRun(String input, String command) {
if (!AllMusic.getConfig().isShowClick()) {
return Component.empty();
}
return miniMessageRun(input, command);
}
/**
* 构建可点击补全指令的文本
* <p>
* 配置关闭 showClick 后返回空内容,因为1.7.10客户端不支持点击事件
*
* @param input 显示文本
* @param command 补全的指令
* @return 文本
*/
public final Component clickSuggest(String input, String command) {
if (!AllMusic.getConfig().isShowClick()) {
return Component.empty();
}
return miniMessageSuggest(input, command);
}
/**
* 更新信息
*/
@@ -18,7 +18,6 @@ import com.velocitypowered.api.proxy.ConsoleCommandSource;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ServerConnection;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import io.netty.buffer.ByteBuf;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.minimessage.MiniMessage;
@@ -168,7 +167,7 @@ public class SideVelocity extends BaseSide implements IEconomy {
public void send(Object player, MusicPack pack) {
if (player instanceof Player) {
Player player1 = (Player) player;
send(player1, MusicPacketCodec.pack(pack));
send(player1, MusicPacketCodec.packBytes(pack));
}
}
@@ -280,10 +279,10 @@ public class SideVelocity extends BaseSide implements IEconomy {
}
}
private void send(Player players, ByteBuf data) {
if (players == null)
private void send(Player players, byte[] data) {
if (players == null || data == null || data.length == 0)
return;
runTask(() -> players.sendPluginMessage(AllMusicVelocity.channel, data.array()));
runTask(() -> players.sendPluginMessage(AllMusicVelocity.channel, data));
}
private boolean skip(Player player) {