Merge pull request #133 from hutuyee/main

support bungeeocrd & fix forge 1.12.2 some bug
This commit is contained in:
Color_yr authored and GitHub committed 2026-08-23 09:20:00 +08:00
commit b8bb1aac1e
14 files changed
+628 -3

No files matched your search

+7 -1
View File
@@ -1,3 +1,5 @@
import com.gtnewhorizons.retrofuturagradle.mcp.ReobfuscatedJar
plugins {
id("com.gtnewhorizons.retrofuturagradle") version "2.0.2"
}
@@ -22,12 +24,16 @@ tasks {
shadowJar {
archiveFileName.set("[forge-1.12.2]AllMusic_Client-${project.version}.jar")
}
val reobfShadowJar = named<ReobfuscatedJar>("reobfShadowJar") {
archiveFileName.set("[forge-1.12.2]AllMusic_Client-${project.version}.jar")
destinationDirectory.set(file("${parent!!.projectDir}/../build"))
}
configurations.shadow.get().setExtendsFrom(listOf(configurations.named("shadowImplementation").get()))
build {
dependsOn(shadowJar)
dependsOn(reobfShadowJar)
}
}
@@ -18,6 +18,7 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.sound.PlaySoundEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
@@ -71,6 +72,11 @@ public class AllMusicClient implements AllMusicBridge {
}
}
@Mod.EventHandler
public void loadComplete(final FMLLoadCompleteEvent event) {
AllMusicCore.renderInit();
}
@SubscribeEvent
public void onSound(final PlaySoundEvent e) {
if (!AllMusicCore.isPlay()) return;
@@ -32,7 +32,7 @@ public class PicRender extends PictureFrameBuffer {
image.getRGB(0, 0, image.getWidth(), image.getHeight(), sourceTexture.getTextureData(), 0, image.getWidth());
sourceTexture.updateDynamicTexture();
stream = new ByteArrayInputStream(source);
stream = new ByteArrayInputStream(rotate);
image = ImageIO.read(stream);
image.getRGB(0, 0, image.getWidth(), image.getHeight(), rotateTexture.getTextureData(), 0, image.getWidth());
rotateTexture.updateDynamicTexture();
@@ -138,7 +138,7 @@ public class TexRender extends TextureRender {
float y1 = h1;
float z = 0;
float u0 = 0;
float u1 = width;
float u1 = 1;
float v0 = 0;
float v1 = 1;
+34
View File
@@ -0,0 +1,34 @@
repositories {
maven("https://libraries.minecraft.net/")
}
dependencies {
compileOnly("net.md-5:bungeecord-api:1.21-R0.4")
shadowImplementation("net.kyori:adventure-platform-bungeecord:4.4.1") {
exclude(group = "net.md-5", module = "bungeecord-api")
}
shadowImplementation("net.kyori:adventure-text-minimessage:${Versions.minimessage}")
shadowImplementation("net.kyori:adventure-api:${Versions.minimessage}")
shadowImplementation("net.kyori:adventure-text-serializer-gson:${Versions.minimessage}")
shadowImplementation("net.kyori:adventure-text-serializer-legacy:${Versions.minimessage}")
shadowImplementation("net.kyori:adventure-text-serializer-plain:${Versions.minimessage}")
shadowImplementation("net.kyori:adventure-key:${Versions.minimessage}")
}
tasks {
processResources {
filesMatching("bungee.yml") {
expand(
"version" to project.version
)
}
}
shadowJar {
archiveFileName.set("[bungeecord]AllMusic_Server-${project.version}.jar")
destinationDirectory.set(file("${parent!!.projectDir}/../build"))
relocate("net.kyori", "com.coloryr.allmusic.libs.net.kyori")
}
}
@@ -0,0 +1,42 @@
package com.coloryr.allmusic.server;
import com.coloryr.allmusic.server.core.AllMusic;
import net.kyori.adventure.platform.bungeecord.BungeeAudiences;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.plugin.Plugin;
public class AllMusicBungee extends Plugin {
public static AllMusicBungee plugin;
public static BungeeAudiences adventure;
@Override
public void onEnable() {
plugin = this;
adventure = BungeeAudiences.create(this);
AllMusic.log = new LogBungee();
SideBungee side = new SideBungee();
AllMusic.side = side;
AllMusic.economy = side;
AllMusic.init(getDataFolder());
if (!AllMusic.isRun) {
return;
}
ProxyServer proxy = ProxyServer.getInstance();
proxy.registerChannel(AllMusic.channelBC);
proxy.getPluginManager().registerCommand(this, new CommandBungee());
proxy.getPluginManager().registerListener(this, new ListenerBungee());
AllMusic.start();
}
@Override
public void onDisable() {
AllMusic.stop();
if (adventure != null) {
adventure.close();
adventure = null;
}
}
}
@@ -0,0 +1,22 @@
package com.coloryr.allmusic.server;
import com.coloryr.allmusic.server.core.command.CommandEX;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.TabExecutor;
public class CommandBungee extends Command implements TabExecutor {
public CommandBungee() {
super("music");
}
@Override
public void execute(CommandSender sender, String[] args) {
CommandEX.execute(sender, sender.getName(), args);
}
@Override
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
return CommandEX.getTabList(sender, sender.getName(), args);
}
}
@@ -0,0 +1,45 @@
package com.coloryr.allmusic.server;
import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.music.PlayMusic;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
public class ListenerBungee implements Listener {
@EventHandler
public void onPlayerDisconnectEvent(PlayerDisconnectEvent event) {
PlayMusic.removeNowPlayPlayer(event.getPlayer().getName());
}
@EventHandler
public void onServerConnectedEvent(ServerConnectedEvent event) {
AllMusic.joinPlay(event.getPlayer().getName());
}
@EventHandler
public void onPluginMessageEvent(PluginMessageEvent event) {
if (!event.getTag().equals(AllMusic.channelBC)) {
return;
}
event.setCancelled(true);
ByteArrayDataInput data = ByteStreams.newDataInput(event.getData());
int type = data.readInt();
if (type == 255 && event.getSender() instanceof Server) {
Server server = (Server) event.getSender();
SideBungee.TopServers.add(server);
SideBungee.sendAllToServer(server);
SideBungee.sendLyricToServer(server);
} else if (type == 12 || type == 13) {
String uuid = data.readUTF();
int res = data.readInt();
SideBungee.SendToBackend.put(uuid, res);
}
}
}
@@ -0,0 +1,11 @@
package com.coloryr.allmusic.server;
import com.coloryr.allmusic.server.core.side.IAllMusicLogger;
import net.kyori.adventure.text.Component;
public class LogBungee implements IAllMusicLogger {
@Override
public void data(Component data) {
AllMusicBungee.adventure.console().sendMessage(data);
}
}
@@ -0,0 +1,376 @@
package com.coloryr.allmusic.server;
import com.coloryr.allmusic.codec.MusicPack;
import com.coloryr.allmusic.codec.MusicPacketCodec;
import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.IEconomy;
import com.coloryr.allmusic.server.core.music.PlayMusic;
import com.coloryr.allmusic.server.core.objs.music.PlayerAddMusicObj;
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
import com.coloryr.allmusic.server.core.side.BaseSide;
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;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import java.io.File;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit;
public class SideBungee extends BaseSide implements IEconomy {
public static final Set<Server> TopServers = new CopyOnWriteArraySet<>();
public static final Map<String, Integer> SendToBackend = new ConcurrentHashMap<>();
public static void sendAllToServer(Server server) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeInt(0);
if (PlayMusic.nowPlayMusic == null) {
out.writeUTF(AllMusic.getMessage().papi.emptyMusic);
} else {
out.writeUTF(PlayMusic.nowPlayMusic.getName());
}
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(1);
if (PlayMusic.nowPlayMusic == null) {
out.writeUTF("");
} else {
out.writeUTF(PlayMusic.nowPlayMusic.getAl());
}
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(2);
if (PlayMusic.nowPlayMusic == null) {
out.writeUTF("");
} else {
out.writeUTF(PlayMusic.nowPlayMusic.getAlia());
}
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(3);
if (PlayMusic.nowPlayMusic == null) {
out.writeUTF("");
} else {
out.writeUTF(PlayMusic.nowPlayMusic.getAuthor());
}
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(4);
if (PlayMusic.nowPlayMusic == null) {
out.writeUTF("");
} else {
out.writeUTF(PlayMusic.nowPlayMusic.getCall());
}
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(5);
out.writeInt(PlayMusic.getListSize());
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(6);
out.writeUTF(PlayMusic.getAllList());
server.sendData(AllMusic.channelBC, out.toByteArray());
}
public static void sendLyricToServer(Server server) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeInt(7);
if (PlayMusic.lyric == null) {
out.writeUTF("");
} else {
out.writeUTF(PlayMusic.lyric.getLyric());
}
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(8);
if (PlayMusic.lyric == null || PlayMusic.lyric.getTlyric() == null) {
out.writeUTF("");
} else {
out.writeUTF(PlayMusic.lyric.getTlyric());
}
server.sendData(AllMusic.channelBC, out.toByteArray());
out = ByteStreams.newDataOutput();
out.writeInt(9);
out.writeBoolean(PlayMusic.lyric != null && PlayMusic.lyric.getTlyric() != null);
server.sendData(AllMusic.channelBC, out.toByteArray());
}
@Override
public void broadcast(Component data) {
for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) {
if (skip(player)) {
continue;
}
AllMusicBungee.adventure.player(player).sendMessage(data);
}
}
@Override
public boolean needPlay(boolean islist) {
for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) {
String server = player.getServer() == null ? null : player.getServer().getInfo().getName();
if (!AllMusic.isSkip(player.getName(), server, false, islist)) {
return true;
}
}
return false;
}
@Override
public Collection<?> getPlayers() {
return ProxyServer.getInstance().getPlayers();
}
@Override
public String getPlayerName(Object player) {
if (player instanceof ProxiedPlayer) {
return ((ProxiedPlayer) player).getName();
}
return null;
}
@Override
public String getPlayerServer(Object player) {
if (player instanceof ProxiedPlayer) {
Server server = ((ProxiedPlayer) player).getServer();
if (server != null) {
return server.getInfo().getName();
}
}
return null;
}
@Override
public void send(Object player, MusicPack pack) {
if (player instanceof ProxiedPlayer) {
send((ProxiedPlayer) player, MusicPacketCodec.pack(pack));
}
}
@Override
public Object getPlayer(String player) {
return ProxyServer.getInstance().getPlayer(player);
}
@Override
public void sendBar(Object player, Component data) {
if (player instanceof ProxiedPlayer) {
AllMusicBungee.adventure.player((ProxiedPlayer) player).sendActionBar(data);
}
}
@Override
public File getFolder() {
return AllMusicBungee.plugin.getDataFolder();
}
@Override
public void sendMessage(Object obj, Component message) {
if (obj instanceof CommandSender) {
AllMusicBungee.adventure.sender((CommandSender) obj).sendMessage(message);
}
}
@Override
public void runTask(Runnable run) {
ProxyServer.getInstance().getScheduler().runAsync(AllMusicBungee.plugin, run);
}
@Override
public boolean checkPermission(Object player, String permission) {
if (checkPermission(player)) {
return true;
}
if (player instanceof CommandSender) {
return ((CommandSender) player).hasPermission(permission);
}
return false;
}
@Override
public boolean checkPermission(Object player) {
return player == ProxyServer.getInstance().getConsole();
}
@Override
public boolean isPlayer(Object source) {
return source instanceof ProxiedPlayer;
}
@Override
public void runTask(Runnable run, int delay) {
ProxyServer.getInstance().getScheduler()
.schedule(AllMusicBungee.plugin, run, delay, TimeUnit.MILLISECONDS);
}
@Override
public void ping() {
for (Server server : new HashSet<>(TopServers)) {
if (server.isConnected()) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeInt(200);
server.sendData(AllMusic.channelBC, out.toByteArray());
} else {
TopServers.remove(server);
}
}
}
@Override
public boolean onMusicPlay(SongInfoObj obj) {
MusicPlayEvent event = new MusicPlayEvent(obj);
ProxyServer.getInstance().getPluginManager().callEvent(event);
return event.isCancel();
}
@Override
public boolean onMusicAdd(Object obj, PlayerAddMusicObj music) {
MusicAddEvent event = new MusicAddEvent(music, (CommandSender) obj);
ProxyServer.getInstance().getPluginManager().callEvent(event);
return event.isCancel();
}
@Override
public void updateInfo() {
for (Server server : TopServers) {
if (server.isConnected()) {
sendAllToServer(server);
} else {
TopServers.remove(server);
}
}
}
@Override
public void updateLyric() {
for (Server server : TopServers) {
if (server.isConnected()) {
sendLyricToServer(server);
} else {
TopServers.remove(server);
}
}
}
private void send(ProxiedPlayer player, ByteBuf data) {
if (player == null) {
return;
}
runTask(() -> player.sendData(AllMusic.channel, data.array()));
}
private boolean skip(ProxiedPlayer player) {
String server = player.getServer() == null ? null : player.getServer().getInfo().getName();
return AllMusic.isSkip(player.getName(), server, false);
}
@Override
public boolean check(String name, int cost) {
return topEconomy(name, cost, 12);
}
@Override
public boolean cost(String name, int cost) {
return topEconomy(name, cost, 13);
}
@Override
public Component miniMessage(String input) {
return MiniMessage.miniMessage().deserialize(input);
}
@Override
public Component miniMessageRun(String input, String command) {
return miniMessage(input).clickEvent(ClickEvent.runCommand(command));
}
@Override
public Component miniMessageSuggest(String input, String command) {
return miniMessage(input).clickEvent(ClickEvent.suggestCommand(command));
}
private boolean topEconomy(String name, int cost, int type) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeInt(type);
String uuid;
do {
uuid = UUID.randomUUID().toString();
} while (SendToBackend.containsKey(uuid));
SendToBackend.put(uuid, -1);
String server = AllMusic.getConfig().economy.backend;
Server toServer = null;
for (Server connection : TopServers) {
if (connection.isConnected() && connection.getInfo().getName().equalsIgnoreCase(server)) {
toServer = connection;
break;
}
}
if (toServer == null) {
AllMusic.log.data("<light_purple>[AllMusic]<red>没有找到目标服务器");
return false;
}
out.writeUTF(uuid);
out.writeInt(cost);
out.writeUTF(name);
toServer.sendData(AllMusic.channelBC, out.toByteArray());
Integer res;
int count = 0;
do {
try {
res = SendToBackend.get(uuid);
if (res == null) {
return false;
} else if (res == -1) {
Thread.sleep(1);
count++;
} else if (res == 0) {
AllMusic.log.data("<light_purple>[AllMusic]<red>后端经济插件错误");
SendToBackend.remove(uuid);
return false;
} else if (res == 1) {
SendToBackend.remove(uuid);
return false;
} else if (res == 2) {
SendToBackend.remove(uuid);
return true;
}
} catch (Exception e) {
AllMusic.log.data("<light_purple>[AllMusic]<red>经济数据发送错误");
e.printStackTrace();
}
} while (count < 100);
AllMusic.log.data("<light_purple>[AllMusic]<red>经济数据请求超时");
return false;
}
}
@@ -0,0 +1,44 @@
package com.coloryr.allmusic.server.event;
import com.coloryr.allmusic.server.core.objs.music.PlayerAddMusicObj;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.plugin.Event;
/**
* 音乐添加事件
*/
public class MusicAddEvent extends Event {
/**
* 添加的音乐
*/
private final PlayerAddMusicObj music;
/**
* 添加者
*/
private final CommandSender player;
/**
* 是否取消添加
*/
private boolean cancel = false;
public MusicAddEvent(PlayerAddMusicObj id, CommandSender player) {
this.music = id;
this.player = player;
}
public boolean isCancel() {
return cancel;
}
public void setCancel(boolean cancel) {
this.cancel = cancel;
}
public CommandSender getPlayer() {
return player;
}
public PlayerAddMusicObj getMusic() {
return music;
}
}
@@ -0,0 +1,34 @@
package com.coloryr.allmusic.server.event;
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
import net.md_5.bungee.api.plugin.Event;
/**
* 音乐播发事件
*/
public class MusicPlayEvent extends Event {
/**
* 音乐内容
*/
private final SongInfoObj music;
/**
* 是否取消
*/
private boolean cancel = false;
public MusicPlayEvent(SongInfoObj music) {
this.music = music;
}
public SongInfoObj getMusic() {
return music;
}
public boolean isCancel() {
return cancel;
}
public void setCancel(boolean cancel) {
this.cancel = cancel;
}
}
@@ -0,0 +1,4 @@
name: AllMusic
main: com.coloryr.allmusic.server.AllMusicBungee
author: Color_yr
version: ${version}
+1
View File
@@ -55,6 +55,7 @@ include(":server:spigot")
include(":server:paper")
include(":server:folia")
include(":server:paper")
include(":server:bungeecord")
include(":server:velocity")
include(":onejar")