mirror of
https://github.com/Coloryr/AllMusic.git
synced 2026-11-08 18:54:44 +00:00
4.2.9
This commit is contained in:
1 parent
4e8058193f
commit
4560231e3e
17 files changed
+270
-75
No files matched your search
+3
-1
@@ -26,4 +26,6 @@ forge*changelog.txt
|
||||
|
||||
lib/
|
||||
target/
|
||||
.DS_Store
|
||||
.DS_Store
|
||||
/.tmp_bc
|
||||
/.tmp_rfg
|
||||
@@ -85,6 +85,7 @@ AllMusic不会内置音乐api,你想要正常使用需要自己安装
|
||||
- mutePlayMessage 是否不发送播放信息
|
||||
- muteAddMessage 是否不发送点歌信息
|
||||
- showInBar 是否将信息限制在bar处
|
||||
- showClick 是否显示[点我]操作,1.7.10客户端不支持点击事件,可设为false关闭
|
||||
- ktvMode 是否启用KTV歌词
|
||||
- musicBR 歌曲音质
|
||||
- version 配置文件版本号
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
+45
-45
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user