From dc86980a04bcbd2e331d684ffddfcaa7af6a2e36 Mon Sep 17 00:00:00 2001 From: Coloryr <402067010@qq.com> Date: Wed, 8 May 2024 16:25:33 +0800 Subject: [PATCH] up --- .github/workflows/gradle.yml | 26 +- .gitignore | 3 +- codec/PacketCodec.java | 51 ++ core/command/CommandEX.java | 65 ++- core/command/CommandHud.java | 87 ++-- core/command/CommandHudSet.java | 128 +++--- core/music/api/HttpClientUtil.java | 2 +- core/music/play/PlayMusic.java | 3 +- core/objs/config/ConfigObj.java | 14 +- core/objs/config/EconomyObj.java | 14 +- core/objs/config/FunConfigObj.java | 10 +- core/objs/config/SaveObj.java | 14 +- core/objs/message/AddMusicObj.java | 14 +- core/objs/message/CancelObj.java | 14 +- core/objs/message/ClickObj.java | 14 +- core/objs/message/CommandObj.java | 14 +- core/objs/message/CostObj.java | 14 +- core/objs/message/CustomObj.java | 14 +- core/objs/message/FunObj.java | 23 +- core/objs/message/HelpAdminObj.java | 14 +- core/objs/message/HelpNormalObj.java | 14 +- core/objs/message/HelpObj.java | 14 +- core/objs/message/HudNameObj.java | 14 +- core/objs/message/HudObj.java | 14 +- core/objs/message/ListMusicObj.java | 14 +- core/objs/message/LyricObj.java | 14 +- core/objs/message/MessageObj.java | 14 +- core/objs/message/MusicPlayObj.java | 14 +- core/objs/message/PAPIObj.java | 14 +- core/objs/message/PageObj.java | 14 +- core/objs/message/PushObj.java | 14 +- core/objs/message/SearchObj.java | 14 +- core/objs/message/VoteObj.java | 14 +- fabric_1_16_5/build.gradle | 20 +- fabric_1_16_5/gradle.properties | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- fabric_1_16_5/settings.gradle | 4 +- .../allmusic/server/AllMusicFabric.java | 3 +- .../server/side/fabric/SideFabric.java | 156 ++----- .../src/main/resources/fabric.mod.json | 4 +- fabric_1_18_2/build.gradle | 13 +- fabric_1_18_2/gradle.properties | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../server/side/fabric/SideFabric.java | 104 +---- .../src/main/resources/fabric.mod.json | 4 +- fabric_1_19_2/build.gradle | 13 +- fabric_1_19_2/gradle.properties | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../server/side/fabric/SideFabric.java | 103 +---- .../src/main/resources/fabric.mod.json | 4 +- fabric_1_19_3/build.gradle | 14 +- fabric_1_19_3/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../server/side/fabric/SideFabric.java | 103 +---- .../src/main/resources/fabric.mod.json | 4 +- fabric_1_20/build.gradle | 20 +- fabric_1_20/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../server/side/fabric/SideFabric.java | 105 +---- .../src/main/resources/fabric.mod.json | 4 +- fabric_1_20_2/build.gradle | 30 +- fabric_1_20_2/gradle.properties | 5 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../server/side/fabric/SideFabric.java | 86 +--- .../src/main/resources/fabric.mod.json | 4 +- fabric_1_20_6/.gitignore | 40 ++ fabric_1_20_6/build.gradle | 92 ++++ fabric_1_20_6/gradle.properties | 18 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 61608 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + fabric_1_20_6/gradlew | 244 ++++++++++ fabric_1_20_6/gradlew.bat | 92 ++++ fabric_1_20_6/settings.gradle | 12 + .../allmusic/server/AllMusicFabric.java | 55 +++ .../coloryr/allmusic/server/PackPayload.java | 16 + .../com/coloryr/allmusic/server/TaskItem.java | 6 + .../com/coloryr/allmusic/server/Tasks.java | 27 ++ .../server/mixin/IGetCommandOutput.java | 13 + .../server/mixin/ServerPlayerMixin.java | 24 + .../server/side/fabric/CommandFabric.java | 66 +++ .../server/side/fabric/FabricApi.java | 48 ++ .../server/side/fabric/LogFabric.java | 16 + .../server/side/fabric/SideFabric.java | 434 ++++++++++++++++++ .../side/fabric/event/MusicAddEvent.java | 24 + .../side/fabric/event/MusicPlayEvent.java | 23 + .../resources/allmusic_server.mixins.json | 16 + .../resources/assets/allmusic_server/icon.png | Bin 0 -> 32781 bytes .../src/main/resources/fabric.mod.json | 39 ++ .../allmusic/server/side/folia/SideFolia.java | 112 +---- .../allmusic/server/side/forge/SideForge.java | 86 +--- .../allmusic/server/side/forge/SideForge.java | 86 +--- .../allmusic/server/side/forge/SideForge.java | 84 +--- .../allmusic/server/side/forge/SideForge.java | 84 +--- .../allmusic/server/side/forge/SideForge.java | 84 +--- .../allmusic/server/side/forge/SideForge.java | 84 +--- link.cmd | 13 +- .../allmusic/server/side/forge/PackData.java | 26 +- .../allmusic/server/side/forge/SideForge.java | 19 +- .../allmusic/server/side/forge/PackData.java | 17 +- .../allmusic/server/side/forge/SideForge.java | 2 - remove.cmd | 11 +- .../allmusic/server/side/bc/SideBC.java | 100 +--- .../server/side/velocity/SideVelocity.java | 105 ++--- 103 files changed, 2226 insertions(+), 1560 deletions(-) create mode 100644 codec/PacketCodec.java create mode 100644 fabric_1_20_6/.gitignore create mode 100644 fabric_1_20_6/build.gradle create mode 100644 fabric_1_20_6/gradle.properties create mode 100644 fabric_1_20_6/gradle/wrapper/gradle-wrapper.jar create mode 100644 fabric_1_20_6/gradle/wrapper/gradle-wrapper.properties create mode 100644 fabric_1_20_6/gradlew create mode 100644 fabric_1_20_6/gradlew.bat create mode 100644 fabric_1_20_6/settings.gradle create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/PackPayload.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/TaskItem.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/Tasks.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/IGetCommandOutput.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/ServerPlayerMixin.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/CommandFabric.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/FabricApi.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/LogFabric.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicAddEvent.java create mode 100644 fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicPlayEvent.java create mode 100644 fabric_1_20_6/src/main/resources/allmusic_server.mixins.json create mode 100644 fabric_1_20_6/src/main/resources/assets/allmusic_server/icon.png create mode 100644 fabric_1_20_6/src/main/resources/fabric.mod.json diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index c567d17e..39f502ce 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -199,10 +199,10 @@ jobs: contents: read steps: - uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '17' + java-version: '21' distribution: 'temurin' - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 # v3.1.0 @@ -215,6 +215,28 @@ jobs: with: name: "allmusic_server_fabric_1_20_2" path: build/libs/ + build_fabric_1_20_6: + runs-on: windows-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 # v3.1.0 + - name: build + shell: cmd + run: | + link.cmd && cd fabric_1_20_6 && gradlew build + - name: update + uses: actions/upload-artifact@v4 + with: + name: "allmusic_server_fabric_1_20_6" + path: build/libs/ build_forge_1_12_2: runs-on: windows-latest permissions: diff --git a/.gitignore b/.gitignore index 680627e6..3c8c36ec 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ run forge*changelog.txt lib -**/allmusic/server/core/ \ No newline at end of file +**/allmusic/server/core/ +**/allmusic/server/codec/ \ No newline at end of file diff --git a/codec/PacketCodec.java b/codec/PacketCodec.java new file mode 100644 index 00000000..4779c29e --- /dev/null +++ b/codec/PacketCodec.java @@ -0,0 +1,51 @@ +package com.coloryr.allmusic.server.codec; + +import com.coloryr.allmusic.server.core.objs.enums.ComType; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.nio.charset.StandardCharsets; + +public class PacketCodec { + public static ByteBuf pack(ComType type, String data, int data1) { + ByteBuf buf = Unpooled.buffer(0); + buf.writeByte(type.ordinal()); + switch (type) { + case HUD: + case LYRIC: + case LIST: + case INFO: + case IMG: + case PLAY: + writeString(buf, data); + break; + case POS: + buf.writeInt(data1); + break; + } + return buf; + } + + public static void pack(ByteBuf buf, ComType type, String data, int data1) { + buf.writeByte(type.ordinal()); + switch (type) { + case HUD: + case LYRIC: + case LIST: + case INFO: + case IMG: + case PLAY: + writeString(buf, data); + break; + case POS: + buf.writeInt(data1); + break; + } + } + + private static void writeString(ByteBuf buf, String text) { + byte[] temp = text.getBytes(StandardCharsets.UTF_8); + buf.writeInt(temp.length); + buf.writeBytes(temp); + } +} diff --git a/core/command/CommandEX.java b/core/command/CommandEX.java index 724b3d5b..da549ed2 100644 --- a/core/command/CommandEX.java +++ b/core/command/CommandEX.java @@ -17,6 +17,37 @@ public class CommandEX { public static final Map commandList = new HashMap<>(); public static final Map commandAdminList = new HashMap<>(); + private static final List normal = new ArrayList() {{ + this.add("stop"); + this.add("cancel"); + this.add("list"); + this.add("vote"); + this.add("mute"); + this.add("search"); + this.add("hud"); + this.add("push"); + }}; + /** + * 管理员的指令 + */ + private static final List admin = new ArrayList() {{ + this.add("reload"); + this.add("next"); + this.add("ban"); + this.add("delete"); + this.add("addlist"); + this.add("clearlist"); + this.add("login"); + this.add("code"); + }}; + /** + * 搜歌的指令 + */ + private static final List search = new ArrayList() {{ + this.add("select"); + this.add("nextpage"); + this.add("lastpage"); + }}; static { commandList.put("stop", new CommandStop()); @@ -245,40 +276,6 @@ public class CommandEX { } } - private static final List normal = new ArrayList() {{ - this.add("stop"); - this.add("cancel"); - this.add("list"); - this.add("vote"); - this.add("mute"); - this.add("search"); - this.add("hud"); - this.add("push"); - }}; - - /** - * 管理员的指令 - */ - private static final List admin = new ArrayList() {{ - this.add("reload"); - this.add("next"); - this.add("ban"); - this.add("delete"); - this.add("addlist"); - this.add("clearlist"); - this.add("login"); - this.add("code"); - }}; - - /** - * 搜歌的指令 - */ - private static final List search = new ArrayList() {{ - this.add("select"); - this.add("nextpage"); - this.add("lastpage"); - }}; - /** * 获取Tab指令列表 * diff --git a/core/command/CommandHud.java b/core/command/CommandHud.java index a7918bd4..2118ac1a 100644 --- a/core/command/CommandHud.java +++ b/core/command/CommandHud.java @@ -7,6 +7,17 @@ import com.coloryr.allmusic.server.core.utils.HudUtils; import java.util.*; public class CommandHud extends ACommand { + /** + * Hud的指令 + */ + private static final List hudlist = new ArrayList() {{ + this.add("enable"); + this.add("reset"); + this.add("info"); + this.add("list"); + this.add("lyric"); + this.add("pic"); + }}; private final Map commandList = new HashMap<>(); public CommandHud() { @@ -18,7 +29,39 @@ public class CommandHud extends ACommand { commandList.put("pic", new CommandHudSet(HudType.PIC)); } + @Override + public void ex(Object sender, String name, String[] args) { + if (args.length == 1) { + AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); + } else { + ICommand command = commandList.get(args[1]); + if (command != null) { + command.ex(sender, name, args); + } else { + AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); + } + } + } + + @Override + public List tab(String name, String[] args, int index) { + if (args.length == index + 1) { + return hudlist; + } else { + ICommand command = commandList.get(args[index]); + if (command != null) { + return command.tab(name, args, index + 1); + } + } + return Collections.emptyList(); + } + public static class HudEnable extends ACommand { + private static final List tf = new ArrayList() {{ + this.add("true"); + this.add("false"); + }}; + @Override public void ex(Object sender, String name, String[] args) { if (args.length == 2 || args.length == 3) { @@ -38,11 +81,6 @@ public class CommandHud extends ACommand { } return Collections.emptyList(); } - - private static final List tf = new ArrayList() {{ - this.add("true"); - this.add("false"); - }}; } public static class HudReset extends ACommand { @@ -53,43 +91,4 @@ public class CommandHud extends ACommand { .replace("%Hud%", AllMusic.getMessage().hudList.getHud(null))); } } - - @Override - public void ex(Object sender, String name, String[] args) { - if (args.length == 1) { - AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); - } else { - ICommand command = commandList.get(args[1]); - if (command != null) { - command.ex(sender, name, args); - } else { - AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); - } - } - } - - /** - * Hud的指令 - */ - private static final List hudlist = new ArrayList() {{ - this.add("enable"); - this.add("reset"); - this.add("info"); - this.add("list"); - this.add("lyric"); - this.add("pic"); - }}; - - @Override - public List tab(String name, String[] args, int index) { - if (args.length == index + 1) { - return hudlist; - } else { - ICommand command = commandList.get(args[index]); - if (command != null) { - return command.tab(name, args, index + 1); - } - } - return Collections.emptyList(); - } } diff --git a/core/command/CommandHudSet.java b/core/command/CommandHudSet.java index 133052f3..3ce2afef 100644 --- a/core/command/CommandHudSet.java +++ b/core/command/CommandHudSet.java @@ -9,6 +9,28 @@ import com.coloryr.allmusic.server.core.utils.HudUtils; import java.util.*; public class CommandHudSet extends AHudCommand { + /** + * Hud的指令 + */ + private static final List hud = new ArrayList() {{ + this.add("enable"); + this.add("pos"); + this.add("dir"); + this.add("reset"); + }}; + private static final List pic = new ArrayList() {{ + this.add("size"); + this.add("rotate"); + this.add("speed"); + }}; + private static final List info = new ArrayList() {{ + this.add("color"); + this.add("shadow"); + }}; + private static final List tf = new ArrayList() {{ + this.add("true"); + this.add("false"); + }}; private final Map commandList = new HashMap<>(); public CommandHudSet(HudType type) { @@ -27,6 +49,40 @@ public class CommandHudSet extends AHudCommand { } } + @Override + public void ex(Object sender, String name, String[] args) { + if (args.length == 1) { + AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); + } else { + ICommand command = commandList.get(args[2]); + if (command != null) { + command.ex(sender, name, args); + } else { + AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); + } + } + } + + @Override + public List tab(String name, String[] args, int index) { + if (args.length == index + 1) { + List list = new ArrayList<>(hud); + if (type == HudType.PIC) { + list.addAll(pic); + } else { + list.addAll(info); + } + + return list; + } else { + ICommand command = commandList.get(args[index]); + if (command != null) { + return command.tab(name, args, index + 1); + } + } + return Collections.emptyList(); + } + private static class HudEnable extends AHudCommand { public HudEnable(HudType type) { super(type); @@ -97,6 +153,12 @@ public class CommandHudSet extends AHudCommand { } private static class HudDir extends AHudCommand { + private static final List dir = new ArrayList() {{ + for (HudDirType type : HudDirType.values()) { + this.add(type.name()); + } + }}; + public HudDir(HudType type) { super(type); } @@ -117,12 +179,6 @@ public class CommandHudSet extends AHudCommand { .replace("%Dir%", AllMusic.getMessage().hudList.getDir(type1))); } - private static final List dir = new ArrayList() {{ - for (HudDirType type : HudDirType.values()) { - this.add(type.name()); - } - }}; - @Override public List tab(String name, String[] args, int index) { if (args.length == index + 1) { @@ -225,64 +281,4 @@ public class CommandHudSet extends AHudCommand { AllMusic.getMessage().hud.picSpeed.replace("%Size%", args[3])); } } - - @Override - public void ex(Object sender, String name, String[] args) { - if (args.length == 1) { - AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); - } else { - ICommand command = commandList.get(args[2]); - if (command != null) { - command.ex(sender, name, args); - } else { - AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error); - } - } - } - - /** - * Hud的指令 - */ - private static final List hud = new ArrayList() {{ - this.add("enable"); - this.add("pos"); - this.add("dir"); - this.add("reset"); - }}; - - private static final List pic = new ArrayList() {{ - this.add("size"); - this.add("rotate"); - this.add("speed"); - }}; - - private static final List info = new ArrayList() {{ - this.add("color"); - this.add("shadow"); - }}; - - private static final List tf = new ArrayList() {{ - this.add("true"); - this.add("false"); - }}; - - @Override - public List tab(String name, String[] args, int index) { - if (args.length == index + 1) { - List list = new ArrayList<>(hud); - if (type == HudType.PIC) { - list.addAll(pic); - } else { - list.addAll(info); - } - - return list; - } else { - ICommand command = commandList.get(args[index]); - if (command != null) { - return command.tab(name, args, index + 1); - } - } - return Collections.emptyList(); - } } diff --git a/core/music/api/HttpClientUtil.java b/core/music/api/HttpClientUtil.java index 6a0276d7..00ebea0e 100644 --- a/core/music/api/HttpClientUtil.java +++ b/core/music/api/HttpClientUtil.java @@ -39,7 +39,7 @@ public class HttpClientUtil { public static HttpResObj get(String path, String data) { try { - data = URLEncoder.encode(data, "UTF-8"); + data = URLEncoder.encode(data, StandardCharsets.UTF_8.name()); Request request = new Request.Builder().url(path + data) .addHeader("referer", "https://music.163.com") .addHeader("content-type", "application/json;charset=UTF-8") diff --git a/core/music/play/PlayMusic.java b/core/music/play/PlayMusic.java index f1ff9f31..92b6bf48 100644 --- a/core/music/play/PlayMusic.java +++ b/core/music/play/PlayMusic.java @@ -56,11 +56,10 @@ public class PlayMusic { * 错误次数 */ public static int error; + public static SongInfoObj push; private static boolean isRun; private static int idleNow; - public static SongInfoObj push; - /** * 停止歌曲逻辑 */ diff --git a/core/objs/config/ConfigObj.java b/core/objs/config/ConfigObj.java index a606c618..3fa433b6 100644 --- a/core/objs/config/ConfigObj.java +++ b/core/objs/config/ConfigObj.java @@ -142,6 +142,13 @@ public class ConfigObj { */ public int sendDelay; + public static ConfigObj make() { + ConfigObj config = new ConfigObj(); + config.init(); + + return config; + } + public void addBanMusic(String id) { banMusic.add(id); AllMusic.saveConfig(); @@ -237,11 +244,4 @@ public class ConfigObj { sendDelay = 1000; version = AllMusic.configVersion; } - - public static ConfigObj make() { - ConfigObj config = new ConfigObj(); - config.init(); - - return config; - } } \ No newline at end of file diff --git a/core/objs/config/EconomyObj.java b/core/objs/config/EconomyObj.java index 8e5d079a..c6d9a524 100644 --- a/core/objs/config/EconomyObj.java +++ b/core/objs/config/EconomyObj.java @@ -5,6 +5,13 @@ public class EconomyObj { public String backend; public boolean vault; + public static EconomyObj make() { + EconomyObj obj = new EconomyObj(); + obj.init(); + + return obj; + } + public boolean check() { boolean res = mysqlUrl == null; @@ -16,11 +23,4 @@ public class EconomyObj { mysqlUrl = "jdbc:mysql://localhost:3306/minecraft?autoReconnect=true&autoReconnectForPools=true"; vault = true; } - - public static EconomyObj make() { - EconomyObj obj = new EconomyObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/config/FunConfigObj.java b/core/objs/config/FunConfigObj.java index 2d84ca4d..e17ec91b 100644 --- a/core/objs/config/FunConfigObj.java +++ b/core/objs/config/FunConfigObj.java @@ -4,15 +4,15 @@ public class FunConfigObj { public boolean rain; public int rainRate; - public void init() { - rain = true; - rainRate = 10; - } - public static FunConfigObj make() { FunConfigObj obj = new FunConfigObj(); obj.init(); return obj; } + + public void init() { + rain = true; + rainRate = 10; + } } diff --git a/core/objs/config/SaveObj.java b/core/objs/config/SaveObj.java index c52f28d1..58473aab 100644 --- a/core/objs/config/SaveObj.java +++ b/core/objs/config/SaveObj.java @@ -10,6 +10,13 @@ public class SaveObj { public PosObj pic; public int picRotateSpeed; + public static SaveObj make() { + SaveObj obj = new SaveObj(); + obj.init(); + + return obj; + } + public SaveObj copy() { SaveObj obj1 = new SaveObj(); obj1.info = this.info.copy(); @@ -48,11 +55,4 @@ public class SaveObj { info = new PosObj(74, 2, HudDirType.TOP_LEFT, 0xffffff, false, true); pic = new PosObj(2, 2, HudDirType.TOP_LEFT, 70, true, true); } - - public static SaveObj make() { - SaveObj obj = new SaveObj(); - obj.init(); - - return obj; - } } \ No newline at end of file diff --git a/core/objs/message/AddMusicObj.java b/core/objs/message/AddMusicObj.java index 21dbaba6..2608be33 100644 --- a/core/objs/message/AddMusicObj.java +++ b/core/objs/message/AddMusicObj.java @@ -12,6 +12,13 @@ public class AddMusicObj { public String cancel; public String timeOut; + public static AddMusicObj make() { + AddMusicObj obj = new AddMusicObj(); + obj.init(); + + return obj; + } + public boolean check() { if (listFull == null) return true; @@ -46,11 +53,4 @@ public class AddMusicObj { cancel = "§d[AllMusic3]§e点歌被取消"; timeOut = "§d[AllMusic3]§e点歌被取消,音乐长度过长"; } - - public static AddMusicObj make() { - AddMusicObj obj = new AddMusicObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/CancelObj.java b/core/objs/message/CancelObj.java index 7d218755..772c2b69 100644 --- a/core/objs/message/CancelObj.java +++ b/core/objs/message/CancelObj.java @@ -7,6 +7,13 @@ public class CancelObj { public String err3; public String err4; + public static CancelObj make() { + CancelObj obj = new CancelObj(); + obj.init(); + + return obj; + } + public boolean check() { if (err1 == null) return true; @@ -26,11 +33,4 @@ public class CancelObj { err4 = "§d[AllMusic3]§c输入的序号错误"; done = "§d[AllMusic3]§e已取消你的点歌"; } - - public static CancelObj make() { - CancelObj obj = new CancelObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/ClickObj.java b/core/objs/message/ClickObj.java index 13d6d208..48f9c4a6 100644 --- a/core/objs/message/ClickObj.java +++ b/core/objs/message/ClickObj.java @@ -4,6 +4,13 @@ public class ClickObj { public String clickRun; public String clickCheck; + public static ClickObj make() { + ClickObj obj = new ClickObj(); + obj.init(); + + return obj; + } + public boolean check() { if (clickRun == null) return true; @@ -14,11 +21,4 @@ public class ClickObj { clickRun = "§b[§n点我选择§r§b]"; clickCheck = "§b[§n点我查看§r§b]"; } - - public static ClickObj make() { - ClickObj obj = new ClickObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/CommandObj.java b/core/objs/message/CommandObj.java index 7615a7e9..67eed871 100644 --- a/core/objs/message/CommandObj.java +++ b/core/objs/message/CommandObj.java @@ -4,6 +4,13 @@ public class CommandObj { public String error; public String noPer; + public static CommandObj make() { + CommandObj obj = new CommandObj(); + obj.init(); + + return obj; + } + public boolean check() { if (error == null) return true; @@ -14,11 +21,4 @@ public class CommandObj { error = "§d[AllMusic3]§c参数错误,请输入/music help获取帮助"; noPer = "§d[AllMusic3]§c你没有权限执行这个操作"; } - - public static CommandObj make() { - CommandObj obj = new CommandObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/CostObj.java b/core/objs/message/CostObj.java index aa7f69e1..c61f2a38 100644 --- a/core/objs/message/CostObj.java +++ b/core/objs/message/CostObj.java @@ -6,6 +6,13 @@ public class CostObj { public String noMoney; public String costFail; + public static CostObj make() { + CostObj obj = new CostObj(); + obj.init(); + + return obj; + } + public boolean check() { if (search == null) return true; @@ -22,11 +29,4 @@ public class CostObj { noMoney = "§d[AllMusic3]§c你没有足够的钱"; costFail = "§d[AllMusic3]§c扣钱过程中错误"; } - - public static CostObj make() { - CostObj obj = new CostObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/CustomObj.java b/core/objs/message/CustomObj.java index 448006d8..56e9077c 100644 --- a/core/objs/message/CustomObj.java +++ b/core/objs/message/CustomObj.java @@ -3,6 +3,13 @@ package com.coloryr.allmusic.server.core.objs.message; public class CustomObj { public String info; + public static CustomObj make() { + CustomObj obj = new CustomObj(); + obj.init(); + + return obj; + } + public boolean check() { return info == null; } @@ -10,11 +17,4 @@ public class CustomObj { public void init() { info = "自定义音乐"; } - - public static CustomObj make() { - CustomObj obj = new CustomObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/FunObj.java b/core/objs/message/FunObj.java index cdc304d1..8ab76ca4 100644 --- a/core/objs/message/FunObj.java +++ b/core/objs/message/FunObj.java @@ -3,23 +3,20 @@ package com.coloryr.allmusic.server.core.objs.message; public class FunObj { public String rain; - public boolean check() { - boolean res = false; - if (rain == null) { - res = true; - } - - return res; - } - - public void init() { - rain = "§d[AllMusic3]§e天空开始变得湿润"; - } - public static FunObj make() { FunObj obj = new FunObj(); obj.init(); return obj; } + + public boolean check() { + boolean res = rain == null; + + return res; + } + + public void init() { + rain = "§d[AllMusic3]§e天空开始变得湿润"; + } } diff --git a/core/objs/message/HelpAdminObj.java b/core/objs/message/HelpAdminObj.java index c526a0bf..48ffbb20 100644 --- a/core/objs/message/HelpAdminObj.java +++ b/core/objs/message/HelpAdminObj.java @@ -12,6 +12,13 @@ public class HelpAdminObj { public String login; public String code; + public static HelpAdminObj make() { + HelpAdminObj obj = new HelpAdminObj(); + obj.init(); + + return obj; + } + public boolean check() { if (reload == null) return true; @@ -46,11 +53,4 @@ public class HelpAdminObj { login = "§d[AllMusic3]§e使用/music login [验证码] 登录账户"; code = "§d[AllMusic3]§e使用/music code [手机号] 获取短信验证码"; } - - public static HelpAdminObj make() { - HelpAdminObj obj = new HelpAdminObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/HelpNormalObj.java b/core/objs/message/HelpNormalObj.java index 55b93d46..743c84e5 100644 --- a/core/objs/message/HelpNormalObj.java +++ b/core/objs/message/HelpNormalObj.java @@ -24,6 +24,13 @@ public class HelpNormalObj { public String hud9; public String hud10; + public static HelpNormalObj make() { + HelpNormalObj obj = new HelpNormalObj(); + obj.init(); + + return obj; + } + public boolean check() { if (head == null) return true; @@ -94,11 +101,4 @@ public class HelpNormalObj { hud4 = "§d[AllMusic3]§e使用/music hud pic rotate [开关] 设置图片旋转模式"; hud5 = "§d[AllMusic3]§e使用/music hud pic speed [数值] 设置图片旋转速度"; } - - public static HelpNormalObj make() { - HelpNormalObj obj = new HelpNormalObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/HelpObj.java b/core/objs/message/HelpObj.java index 9ec8902c..09786b2e 100644 --- a/core/objs/message/HelpObj.java +++ b/core/objs/message/HelpObj.java @@ -4,6 +4,13 @@ public class HelpObj { public HelpNormalObj normal; public HelpAdminObj admin; + public static HelpObj make() { + HelpObj obj = new HelpObj(); + obj.init(); + + return obj; + } + public boolean check() { boolean save = false; if (normal == null || normal.check()) { @@ -21,11 +28,4 @@ public class HelpObj { normal = HelpNormalObj.make(); admin = HelpAdminObj.make(); } - - public static HelpObj make() { - HelpObj obj = new HelpObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/HudNameObj.java b/core/objs/message/HudNameObj.java index 75899c0b..64f608b9 100644 --- a/core/objs/message/HudNameObj.java +++ b/core/objs/message/HudNameObj.java @@ -23,6 +23,13 @@ public class HudNameObj { public String pos8; public String pos9; + public static HudNameObj make() { + HudNameObj obj = new HudNameObj(); + obj.init(); + + return obj; + } + public boolean check() { if (list == null) return true; @@ -123,11 +130,4 @@ public class HudNameObj { pos8 = "下"; pos9 = "右下"; } - - public static HudNameObj make() { - HudNameObj obj = new HudNameObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/HudObj.java b/core/objs/message/HudObj.java index 631938c0..2aefb3f5 100644 --- a/core/objs/message/HudObj.java +++ b/core/objs/message/HudObj.java @@ -18,6 +18,13 @@ public class HudObj { public String list; public String ktv; + public static HudObj make() { + HudObj obj = new HudObj(); + obj.init(); + + return obj; + } + public boolean check() { if (state == null) return true; @@ -70,11 +77,4 @@ public class HudObj { ktv = "§e%KLyric%§f%Lyric%§r\n%Tlyric%"; list = "播放列表里面有%Size%首歌\n%List%"; } - - public static HudObj make() { - HudObj obj = new HudObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/ListMusicObj.java b/core/objs/message/ListMusicObj.java index e99c11f4..60ac89d5 100644 --- a/core/objs/message/ListMusicObj.java +++ b/core/objs/message/ListMusicObj.java @@ -5,6 +5,13 @@ public class ListMusicObj { public String item; public String get; + public static ListMusicObj make() { + ListMusicObj obj = new ListMusicObj(); + obj.init(); + + return obj; + } + public boolean check() { boolean res = head == null; if (item == null) @@ -20,11 +27,4 @@ public class ListMusicObj { item = "§e%Index%->%MusicName% | %MusicAuthor% | %MusicAl% | %MusicAlia%"; get = "§d[AllMusic3]§e歌曲列表%ListName%获取成功"; } - - public static ListMusicObj make() { - ListMusicObj obj = new ListMusicObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/LyricObj.java b/core/objs/message/LyricObj.java index d8f8f501..e0e3e12f 100644 --- a/core/objs/message/LyricObj.java +++ b/core/objs/message/LyricObj.java @@ -7,6 +7,13 @@ public class LyricObj { public String empty2; public String empty3; + public static LyricObj make() { + LyricObj obj = new LyricObj(); + obj.init(); + + return obj; + } + public boolean check() { if (data == null) return true; @@ -26,11 +33,4 @@ public class LyricObj { empty2 = "没有翻译歌词"; empty3 = "没有KTV歌词"; } - - public static LyricObj make() { - LyricObj obj = new LyricObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/MessageObj.java b/core/objs/message/MessageObj.java index c94e8e6e..fe04bb46 100644 --- a/core/objs/message/MessageObj.java +++ b/core/objs/message/MessageObj.java @@ -22,6 +22,13 @@ public class MessageObj { public CancelObj cancel; public String version; + public static MessageObj make() { + MessageObj obj = new MessageObj(); + obj.init(); + + return obj; + } + public boolean check() { boolean saveConfig = false; if (musicPlay == null || musicPlay.check()) { @@ -115,11 +122,4 @@ public class MessageObj { cancel = CancelObj.make(); version = AllMusic.messageVersion; } - - public static MessageObj make() { - MessageObj obj = new MessageObj(); - obj.init(); - - return obj; - } } \ No newline at end of file diff --git a/core/objs/message/MusicPlayObj.java b/core/objs/message/MusicPlayObj.java index a16f12e6..f69700db 100644 --- a/core/objs/message/MusicPlayObj.java +++ b/core/objs/message/MusicPlayObj.java @@ -15,6 +15,13 @@ public class MusicPlayObj { public String trail; public String cancel; + public static MusicPlayObj make() { + MusicPlayObj obj = new MusicPlayObj(); + obj.init(); + + return obj; + } + public boolean check() { boolean res = stopPlaying == null; if (emptyPlayingMusic == null) @@ -60,11 +67,4 @@ public class MusicPlayObj { trail = "§d[AllMusic3]§e该音乐为试听音乐"; cancel = "§d[AllMusic3]§e播放被取消"; } - - public static MusicPlayObj make() { - MusicPlayObj obj = new MusicPlayObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/PAPIObj.java b/core/objs/message/PAPIObj.java index 21ac0887..3c100ad6 100644 --- a/core/objs/message/PAPIObj.java +++ b/core/objs/message/PAPIObj.java @@ -3,6 +3,13 @@ package com.coloryr.allmusic.server.core.objs.message; public class PAPIObj { public String emptyMusic; + public static PAPIObj make() { + PAPIObj obj = new PAPIObj(); + obj.init(); + + return obj; + } + public boolean check() { return emptyMusic == null; } @@ -10,11 +17,4 @@ public class PAPIObj { public void init() { emptyMusic = "没有播放的音乐"; } - - public static PAPIObj make() { - PAPIObj obj = new PAPIObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/PageObj.java b/core/objs/message/PageObj.java index 81aa225f..5d931cd2 100644 --- a/core/objs/message/PageObj.java +++ b/core/objs/message/PageObj.java @@ -5,6 +5,13 @@ public class PageObj { public String next; public String last; + public static PageObj make() { + PageObj obj = new PageObj(); + obj.init(); + + return obj; + } + public boolean check() { boolean res = choice == null; if (next == null) @@ -20,11 +27,4 @@ public class PageObj { next = "§e[§n点我下一页§r§e]"; last = "§e[§n点我上一页§r§e]"; } - - public static PageObj make() { - PageObj obj = new PageObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/PushObj.java b/core/objs/message/PushObj.java index 56b4c4bc..7d93eea4 100644 --- a/core/objs/message/PushObj.java +++ b/core/objs/message/PushObj.java @@ -20,6 +20,13 @@ public class PushObj { public String err2; public String err3; + public static PushObj make() { + PushObj obj = new PushObj(); + obj.init(); + + return obj; + } + public boolean check() { if (noPermission == null) return true; @@ -78,11 +85,4 @@ public class PushObj { err3 = "§d[AllMusic3]§c发起失败,已经有人发起了插歌投票"; cancel = "§d[AllMusic3]§e插歌投票已被发起者取消"; } - - public static PushObj make() { - PushObj obj = new PushObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/SearchObj.java b/core/objs/message/SearchObj.java index fbc6da49..eb4c9cd9 100644 --- a/core/objs/message/SearchObj.java +++ b/core/objs/message/SearchObj.java @@ -11,6 +11,13 @@ public class SearchObj { public String cantLast; public String startSearch; + public static SearchObj make() { + SearchObj obj = new SearchObj(); + obj.init(); + + return obj; + } + public boolean check() { if (noPer == null) return true; @@ -42,11 +49,4 @@ public class SearchObj { cantNext = "§d[AllMusic3]§c无法下一页"; cantLast = "§d[AllMusic3]§c无法上一页"; } - - public static SearchObj make() { - SearchObj obj = new SearchObj(); - obj.init(); - - return obj; - } } diff --git a/core/objs/message/VoteObj.java b/core/objs/message/VoteObj.java index 1840f638..0c091803 100644 --- a/core/objs/message/VoteObj.java +++ b/core/objs/message/VoteObj.java @@ -16,6 +16,13 @@ public class VoteObj { public String err3; public String cancel; + public static VoteObj make() { + VoteObj obj = new VoteObj(); + obj.init(); + + return obj; + } + public boolean check() { if (noPermission == null) return true; @@ -62,11 +69,4 @@ public class VoteObj { voteDone = "§d[AllMusic3]§e已切歌"; cancel = "§d[AllMusic3]§e切歌投票已被发起者取消"; } - - public static VoteObj make() { - VoteObj obj = new VoteObj(); - obj.init(); - - return obj; - } } diff --git a/fabric_1_16_5/build.gradle b/fabric_1_16_5/build.gradle index 2db5a841..973656b8 100644 --- a/fabric_1_16_5/build.gradle +++ b/fabric_1_16_5/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'fabric-loom' version '1.4-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'maven-publish' - id "org.jetbrains.kotlin.jvm" version "1.8.10" + id "org.jetbrains.kotlin.jvm" version "1.9.23" } version = project.mod_version @@ -11,7 +11,6 @@ base { archivesName = project.archives_base_name } - repositories { // Add repositories to retrieve artifacts from in here. // You should only use this when depending on other mods because @@ -49,7 +48,13 @@ processResources { } tasks.withType(JavaCompile).configureEach { - it.options.release = 16 + it.options.release = 8 +} + +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 1.8 + } } java { @@ -58,8 +63,8 @@ java { // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_16 - targetCompatibility = JavaVersion.VERSION_16 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } jar { @@ -71,7 +76,8 @@ jar { // configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } diff --git a/fabric_1_16_5/gradle.properties b/fabric_1_16_5/gradle.properties index 7b7f326d..b6b300bb 100644 --- a/fabric_1_16_5/gradle.properties +++ b/fabric_1_16_5/gradle.properties @@ -6,8 +6,8 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.16.5 yarn_mappings=1.16.5+build.10 -loader_version=0.15.6 -fabric_kotlin_version=1.9.1+kotlin.1.8.10 +loader_version=0.15.11 +fabric_kotlin_version=1.10.19+kotlin.1.9.23 # Mod Properties mod_version = 3.0.0 diff --git a/fabric_1_16_5/gradle/wrapper/gradle-wrapper.properties b/fabric_1_16_5/gradle/wrapper/gradle-wrapper.properties index c30b486a..b82aa23a 100644 --- a/fabric_1_16_5/gradle/wrapper/gradle-wrapper.properties +++ b/fabric_1_16_5/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric_1_16_5/settings.gradle b/fabric_1_16_5/settings.gradle index 56266b41..6935efd5 100644 --- a/fabric_1_16_5/settings.gradle +++ b/fabric_1_16_5/settings.gradle @@ -7,4 +7,6 @@ pluginManagement { mavenCentral() gradlePluginPortal() } -} \ No newline at end of file +} + +rootProject.name = 'AllMusic_Server' \ No newline at end of file diff --git a/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java b/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java index 1f292ecd..59da2ec9 100644 --- a/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java +++ b/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java @@ -16,10 +16,9 @@ import org.apache.logging.log4j.Logger; import java.io.File; public class AllMusicFabric implements ModInitializer { - public static MinecraftServer server; public static final Logger LOGGER = LogManager.getLogger("AllMusic_Server"); - public static final Identifier ID = new Identifier("allmusic", "channel"); + public static MinecraftServer server; @Override public void onInitialize() { diff --git a/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java b/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java index bce6cad8..c10b58fb 100644 --- a/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java +++ b/fabric_1_16_5/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.fabric; import com.coloryr.allmusic.server.AllMusicFabric; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -14,7 +15,6 @@ import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.side.fabric.event.MusicAddEvent; import com.coloryr.allmusic.server.side.fabric.event.MusicPlayEvent; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.network.PacketByteBuf; import net.minecraft.server.command.CommandOutput; @@ -23,7 +23,7 @@ import net.minecraft.text.Text; import net.minecraft.util.ActionResult; import java.io.File; -import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -55,7 +55,7 @@ public class SideFabric extends ISide { @Override public boolean checkPermission(String player, String permission) { - var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + ServerPlayerEntity player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return false; @@ -65,7 +65,7 @@ public class SideFabric extends ISide { @Override public boolean needPlay() { int online = getAllPlayer(); - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.getConfig().mutePlayer.contains(player.getName().getString())) { online--; } @@ -76,11 +76,8 @@ public class SideFabric extends ISide { @Override protected void topSendStop() { try { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - - send(player, buf); + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -91,12 +88,10 @@ public class SideFabric extends ISide { @Override protected void topSendStop(String name) { try { - var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + ServerPlayerEntity player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -104,18 +99,12 @@ public class SideFabric extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player, buf); - + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -125,18 +114,14 @@ public class SideFabric extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { - var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + ServerPlayerEntity player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -144,21 +129,16 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) continue; String name = player.getName().getString(); SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -167,18 +147,14 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { - var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + ServerPlayerEntity player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -188,16 +164,12 @@ public class SideFabric extends ISide { @Override public void sendPos(String player, int pos) { try { - var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + ServerPlayerEntity player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -207,19 +179,14 @@ public class SideFabric extends ISide { @Override public void sendHudLyric(String data) { try { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) continue; String name = player.getName().getString(); SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -230,19 +197,14 @@ public class SideFabric extends ISide { @Override public void sendHudInfo(String data) { try { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) continue; String name = player.getName().getString(); SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -253,16 +215,12 @@ public class SideFabric extends ISide { @Override public void sendHudPos(String name) { try { - var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + ServerPlayerEntity player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -275,28 +233,24 @@ public class SideFabric extends ISide { if (pos == HudType.PIC) { return; } - var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + ServerPlayerEntity player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -306,19 +260,14 @@ public class SideFabric extends ISide { @Override public void sendHudList(String data) { try { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) continue; String name = player.getName().getString(); SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -328,15 +277,12 @@ public class SideFabric extends ISide { @Override public void sendHudUtilsAll() { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { String Name = player.getName().getString(); try { SaveObj obj = HudUtils.get(Name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -346,7 +292,7 @@ public class SideFabric extends ISide { @Override public void sendBar(String data) { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { try { if (AllMusic.isOK(player.getName().getString(), null, true)) continue; @@ -361,14 +307,10 @@ public class SideFabric extends ISide { @Override public void clearHud(String name) { try { - var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + ServerPlayerEntity player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -378,10 +320,8 @@ public class SideFabric extends ISide { @Override public void clearHud() { try { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); @@ -395,7 +335,7 @@ public class SideFabric extends ISide { && data.length() > AllMusic.getConfig().messageLimitSize) { data = data.substring(0, AllMusic.getConfig().messageLimitSize - 1) + "..."; } - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (!AllMusic.getConfig().mutePlayer.contains(player.getName().getString())) { player.sendMessage(Text.of(data), false); } @@ -413,9 +353,9 @@ public class SideFabric extends ISide { && data.length() > AllMusic.getConfig().messageLimitSize) { data = data.substring(0, AllMusic.getConfig().messageLimitSize - 1) + "..."; } - var finalData = Text.of(data); + Text finalData = Text.of(data); runTask(() -> { - for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + for (ServerPlayerEntity player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (!AllMusic.getConfig().mutePlayer.contains(player.getName().getString())) { player.sendMessage(finalData, false); } @@ -471,7 +411,7 @@ public class SideFabric extends ISide { @Override public List getPlayerList() { - return List.of(); + return Arrays.asList(AllMusicFabric.server.getPlayerNames()); } private void send(ServerPlayerEntity players, ByteBuf data) { @@ -484,10 +424,4 @@ public class SideFabric extends ISide { e.printStackTrace(); } } - - private void writeString(ByteBuf buf, String data) { - byte[] temp = data.getBytes(StandardCharsets.UTF_8); - buf.writeInt(temp.length) - .writeBytes(temp); - } } diff --git a/fabric_1_16_5/src/main/resources/fabric.mod.json b/fabric_1_16_5/src/main/resources/fabric.mod.json index 649fac1d..2b1e2ba0 100644 --- a/fabric_1_16_5/src/main/resources/fabric.mod.json +++ b/fabric_1_16_5/src/main/resources/fabric.mod.json @@ -26,10 +26,10 @@ "allmusic_server.mixins.json" ], "depends": { - "fabricloader": ">=0.8.8", + "fabricloader": ">=0.15.11", "fabric": "*", "minecraft": ">=1.16", - "fabric-language-kotlin": ">=1.8.10" + "fabric-language-kotlin": ">=1.10.19" }, "suggests": { diff --git a/fabric_1_18_2/build.gradle b/fabric_1_18_2/build.gradle index 723a1331..9aaee45e 100644 --- a/fabric_1_18_2/build.gradle +++ b/fabric_1_18_2/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'fabric-loom' version '1.4-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'maven-publish' - id "org.jetbrains.kotlin.jvm" version "1.8.10" + id "org.jetbrains.kotlin.jvm" version "1.9.23" } version = project.mod_version @@ -51,6 +51,12 @@ tasks.withType(JavaCompile).configureEach { it.options.release = 17 } +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 17 + } +} + java { // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task // if it is present. @@ -70,7 +76,8 @@ jar { // configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } diff --git a/fabric_1_18_2/gradle.properties b/fabric_1_18_2/gradle.properties index 33f3a592..a3aadec3 100644 --- a/fabric_1_18_2/gradle.properties +++ b/fabric_1_18_2/gradle.properties @@ -6,8 +6,8 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.18.2 yarn_mappings=1.18.2+build.4 -loader_version=0.15.3 -fabric_kotlin_version=1.9.1+kotlin.1.8.10 +loader_version=0.15.11 +fabric_kotlin_version=1.10.19+kotlin.1.9.23 # Mod Properties mod_version=3.0.0 diff --git a/fabric_1_18_2/gradle/wrapper/gradle-wrapper.properties b/fabric_1_18_2/gradle/wrapper/gradle-wrapper.properties index c30b486a..b82aa23a 100644 --- a/fabric_1_18_2/gradle/wrapper/gradle-wrapper.properties +++ b/fabric_1_18_2/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric_1_18_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java b/fabric_1_18_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java index bce6cad8..50c3e2e2 100644 --- a/fabric_1_18_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java +++ b/fabric_1_18_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.fabric; import com.coloryr.allmusic.server.AllMusicFabric; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -14,7 +15,6 @@ import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.side.fabric.event.MusicAddEvent; import com.coloryr.allmusic.server.side.fabric.event.MusicPlayEvent; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.network.PacketByteBuf; import net.minecraft.server.command.CommandOutput; @@ -77,10 +77,7 @@ public class SideFabric extends ISide { protected void topSendStop() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -94,9 +91,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -104,18 +99,12 @@ public class SideFabric extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player, buf); - + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -125,18 +114,14 @@ public class SideFabric extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -144,7 +129,7 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -153,12 +138,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -167,18 +147,14 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -193,11 +169,7 @@ public class SideFabric extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -214,12 +186,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -237,12 +204,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -258,11 +220,7 @@ public class SideFabric extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -282,21 +240,17 @@ public class SideFabric extends ISide { if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -313,12 +267,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -333,10 +282,7 @@ public class SideFabric extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -364,11 +310,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -379,9 +321,7 @@ public class SideFabric extends ISide { public void clearHud() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/fabric_1_18_2/src/main/resources/fabric.mod.json b/fabric_1_18_2/src/main/resources/fabric.mod.json index 9b01c1c0..6fa1b28c 100644 --- a/fabric_1_18_2/src/main/resources/fabric.mod.json +++ b/fabric_1_18_2/src/main/resources/fabric.mod.json @@ -25,11 +25,11 @@ "allmusic_server.mixins.json" ], "depends": { - "fabricloader": ">=0.14.14", + "fabricloader": ">=0.15.11", "minecraft": "~1.18.2", "java": ">=17", "fabric-api": "*", - "fabric-language-kotlin": ">=1.8.10" + "fabric-language-kotlin": ">=1.10.19" }, "suggests": { diff --git a/fabric_1_19_2/build.gradle b/fabric_1_19_2/build.gradle index 723a1331..02d5fe0f 100644 --- a/fabric_1_19_2/build.gradle +++ b/fabric_1_19_2/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'fabric-loom' version '1.4-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'maven-publish' - id "org.jetbrains.kotlin.jvm" version "1.8.10" + id "org.jetbrains.kotlin.jvm" version "1.9.23" } version = project.mod_version @@ -51,6 +51,12 @@ tasks.withType(JavaCompile).configureEach { it.options.release = 17 } +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 17 + } +} + java { // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task // if it is present. @@ -70,7 +76,8 @@ jar { // configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } diff --git a/fabric_1_19_2/gradle.properties b/fabric_1_19_2/gradle.properties index 1a455b7e..d6877c44 100644 --- a/fabric_1_19_2/gradle.properties +++ b/fabric_1_19_2/gradle.properties @@ -6,8 +6,8 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.19.2 yarn_mappings=1.19.2+build.28 -loader_version=0.15.3 -fabric_kotlin_version=1.9.1+kotlin.1.8.10 +loader_version=0.15.11 +fabric_kotlin_version=1.10.19+kotlin.1.9.23 # Mod Properties mod_version = 3.0.0 @@ -15,4 +15,4 @@ maven_group = com.coloryr.allmusic.server archives_base_name =[fabric-1.19.2]AllMusic_Server # Dependencies -fabric_version=0.75.1+1.19.2 \ No newline at end of file +fabric_version=0.77.0+1.19.2 \ No newline at end of file diff --git a/fabric_1_19_2/gradle/wrapper/gradle-wrapper.properties b/fabric_1_19_2/gradle/wrapper/gradle-wrapper.properties index c30b486a..b82aa23a 100644 --- a/fabric_1_19_2/gradle/wrapper/gradle-wrapper.properties +++ b/fabric_1_19_2/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric_1_19_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java b/fabric_1_19_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java index bf91f5b9..936da51d 100644 --- a/fabric_1_19_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java +++ b/fabric_1_19_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.fabric; import com.coloryr.allmusic.server.AllMusicFabric; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -76,10 +77,7 @@ public class SideFabric extends ISide { protected void topSendStop() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -93,9 +91,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -103,18 +99,12 @@ public class SideFabric extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player, buf); - + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -124,18 +114,14 @@ public class SideFabric extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -143,7 +129,7 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -152,12 +138,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -166,18 +147,14 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -192,11 +169,7 @@ public class SideFabric extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -213,12 +186,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -236,12 +204,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -257,11 +220,7 @@ public class SideFabric extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -281,21 +240,17 @@ public class SideFabric extends ISide { if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -312,12 +267,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -332,10 +282,7 @@ public class SideFabric extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -363,11 +310,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -378,9 +321,7 @@ public class SideFabric extends ISide { public void clearHud() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/fabric_1_19_2/src/main/resources/fabric.mod.json b/fabric_1_19_2/src/main/resources/fabric.mod.json index dfd38c9e..4d222fa3 100644 --- a/fabric_1_19_2/src/main/resources/fabric.mod.json +++ b/fabric_1_19_2/src/main/resources/fabric.mod.json @@ -25,11 +25,11 @@ "allmusic_server.mixins.json" ], "depends": { - "fabricloader": ">=0.14.14", + "fabricloader": ">=0.15.11", "minecraft": "~1.19.2", "java": ">=17", "fabric-api": "*", - "fabric-language-kotlin": ">=1.8.10" + "fabric-language-kotlin": ">=1.10.19" }, "suggests": { diff --git a/fabric_1_19_3/build.gradle b/fabric_1_19_3/build.gradle index 5eb83e55..02d5fe0f 100644 --- a/fabric_1_19_3/build.gradle +++ b/fabric_1_19_3/build.gradle @@ -1,6 +1,7 @@ plugins { - id 'fabric-loom' version '1.4-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'maven-publish' + id "org.jetbrains.kotlin.jvm" version "1.9.23" } version = project.mod_version @@ -26,7 +27,7 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation("net.fabricmc:fabric-language-kotlin:1.9.1+kotlin.1.8.10") + modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}" include modImplementation('com.squareup.okio:okio-jvm:3.0.0') include modImplementation('com.squareup.okhttp3:okhttp:4.10.0') @@ -50,6 +51,12 @@ tasks.withType(JavaCompile).configureEach { it.options.release = 17 } +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 17 + } +} + java { // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task // if it is present. @@ -69,7 +76,8 @@ jar { // configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } diff --git a/fabric_1_19_3/gradle.properties b/fabric_1_19_3/gradle.properties index 85ee2ffc..bf86647b 100644 --- a/fabric_1_19_3/gradle.properties +++ b/fabric_1_19_3/gradle.properties @@ -6,7 +6,8 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.19.3 yarn_mappings=1.19.3+build.5 -loader_version=0.15.3 +loader_version=0.15.11 +fabric_kotlin_version=1.10.19+kotlin.1.9.23 # Mod Properties mod_version = 3.0.0 diff --git a/fabric_1_19_3/gradle/wrapper/gradle-wrapper.properties b/fabric_1_19_3/gradle/wrapper/gradle-wrapper.properties index c30b486a..b82aa23a 100644 --- a/fabric_1_19_3/gradle/wrapper/gradle-wrapper.properties +++ b/fabric_1_19_3/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric_1_19_3/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java b/fabric_1_19_3/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java index bf91f5b9..936da51d 100644 --- a/fabric_1_19_3/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java +++ b/fabric_1_19_3/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.fabric; import com.coloryr.allmusic.server.AllMusicFabric; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -76,10 +77,7 @@ public class SideFabric extends ISide { protected void topSendStop() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -93,9 +91,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -103,18 +99,12 @@ public class SideFabric extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player, buf); - + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -124,18 +114,14 @@ public class SideFabric extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -143,7 +129,7 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -152,12 +138,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -166,18 +147,14 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -192,11 +169,7 @@ public class SideFabric extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -213,12 +186,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -236,12 +204,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -257,11 +220,7 @@ public class SideFabric extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -281,21 +240,17 @@ public class SideFabric extends ISide { if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -312,12 +267,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -332,10 +282,7 @@ public class SideFabric extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -363,11 +310,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -378,9 +321,7 @@ public class SideFabric extends ISide { public void clearHud() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/fabric_1_19_3/src/main/resources/fabric.mod.json b/fabric_1_19_3/src/main/resources/fabric.mod.json index d1e75d3c..e4b944aa 100644 --- a/fabric_1_19_3/src/main/resources/fabric.mod.json +++ b/fabric_1_19_3/src/main/resources/fabric.mod.json @@ -27,11 +27,11 @@ ], "depends": { - "fabricloader": ">=0.14.14", + "fabricloader": ">=0.15.11", "fabric-api": "*", "minecraft": "~1.19.3", "java": ">=17", - "fabric-language-kotlin": ">=1.9.1+kotlin.1.8.10" + "fabric-language-kotlin": ">=1.10.19" }, "suggests": { diff --git a/fabric_1_20/build.gradle b/fabric_1_20/build.gradle index 5eb83e55..10f5aaa2 100644 --- a/fabric_1_20/build.gradle +++ b/fabric_1_20/build.gradle @@ -1,6 +1,7 @@ plugins { - id 'fabric-loom' version '1.4-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'maven-publish' + id "org.jetbrains.kotlin.jvm" version "1.9.23" } version = project.mod_version @@ -26,7 +27,7 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation("net.fabricmc:fabric-language-kotlin:1.9.1+kotlin.1.8.10") + modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}" include modImplementation('com.squareup.okio:okio-jvm:3.0.0') include modImplementation('com.squareup.okhttp3:okhttp:4.10.0') @@ -47,7 +48,13 @@ processResources { } tasks.withType(JavaCompile).configureEach { - it.options.release = 17 + it.options.release = 21 +} + +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 21 + } } java { @@ -56,8 +63,8 @@ java { // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } jar { @@ -69,7 +76,8 @@ jar { // configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } diff --git a/fabric_1_20/gradle.properties b/fabric_1_20/gradle.properties index 3cd89371..899bd87a 100644 --- a/fabric_1_20/gradle.properties +++ b/fabric_1_20/gradle.properties @@ -6,7 +6,8 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.20 yarn_mappings=1.20+build.1 -loader_version=0.15.3 +loader_version=0.15.11 +fabric_kotlin_version=1.10.19+kotlin.1.9.23 # Mod Properties mod_version = 3.0.0 diff --git a/fabric_1_20/gradle/wrapper/gradle-wrapper.properties b/fabric_1_20/gradle/wrapper/gradle-wrapper.properties index c30b486a..b82aa23a 100644 --- a/fabric_1_20/gradle/wrapper/gradle-wrapper.properties +++ b/fabric_1_20/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric_1_20/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java b/fabric_1_20/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java index bf91f5b9..ae675bf3 100644 --- a/fabric_1_20/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java +++ b/fabric_1_20/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.fabric; import com.coloryr.allmusic.server.AllMusicFabric; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -13,8 +14,6 @@ import com.coloryr.allmusic.server.core.side.ISide; import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.side.fabric.event.MusicAddEvent; import com.coloryr.allmusic.server.side.fabric.event.MusicPlayEvent; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.network.PacketByteBuf; import net.minecraft.server.command.CommandOutput; @@ -76,10 +75,7 @@ public class SideFabric extends ISide { protected void topSendStop() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -93,9 +89,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -103,18 +97,12 @@ public class SideFabric extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player, buf); - + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -124,18 +112,14 @@ public class SideFabric extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -143,7 +127,7 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -152,12 +136,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -166,18 +145,14 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -192,11 +167,7 @@ public class SideFabric extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -213,12 +184,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -236,12 +202,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -257,11 +218,7 @@ public class SideFabric extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -281,21 +238,17 @@ public class SideFabric extends ISide { if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -312,12 +265,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -332,10 +280,7 @@ public class SideFabric extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -363,11 +308,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -378,9 +319,7 @@ public class SideFabric extends ISide { public void clearHud() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/fabric_1_20/src/main/resources/fabric.mod.json b/fabric_1_20/src/main/resources/fabric.mod.json index 18f34c38..5c474170 100644 --- a/fabric_1_20/src/main/resources/fabric.mod.json +++ b/fabric_1_20/src/main/resources/fabric.mod.json @@ -27,11 +27,11 @@ ], "depends": { - "fabricloader": ">=0.14.21", + "fabricloader": ">=0.15.11", "fabric-api": "*", "minecraft": "~1.20", "java": ">=17", - "fabric-language-kotlin": ">=1.9.1+kotlin.1.8.10" + "fabric-language-kotlin": ">=1.10.19" }, "suggests": { diff --git a/fabric_1_20_2/build.gradle b/fabric_1_20_2/build.gradle index d116c3bf..02d5fe0f 100644 --- a/fabric_1_20_2/build.gradle +++ b/fabric_1_20_2/build.gradle @@ -1,15 +1,16 @@ plugins { - id 'fabric-loom' version '1.4-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'maven-publish' + id "org.jetbrains.kotlin.jvm" version "1.9.23" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - -archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group +base { + archivesName = project.archives_base_name +} + repositories { // Add repositories to retrieve artifacts from in here. // You should only use this when depending on other mods because @@ -26,7 +27,7 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation("net.fabricmc:fabric-language-kotlin:1.9.1+kotlin.1.8.10") + modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}" include modImplementation('com.squareup.okio:okio-jvm:3.0.0') include modImplementation('com.squareup.okhttp3:okhttp:4.10.0') @@ -47,27 +48,36 @@ processResources { } tasks.withType(JavaCompile).configureEach { - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. it.options.release = 17 } +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 17 + } +} + java { // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task // if it is present. // If you remove this line, sources will not be generated. withSourcesJar() + + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } jar { from("LICENSE") { - rename { "${it}_${project.archivesBaseName}"} + rename { "${it}_${project.base.archivesName.get()}"} } } // configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } @@ -79,4 +89,4 @@ publishing { // The repositories here will be used for publishing your artifact, not for // retrieving dependencies. } -} +} \ No newline at end of file diff --git a/fabric_1_20_2/gradle.properties b/fabric_1_20_2/gradle.properties index 2a30f3b6..d7703747 100644 --- a/fabric_1_20_2/gradle.properties +++ b/fabric_1_20_2/gradle.properties @@ -6,7 +6,8 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.20.2 yarn_mappings=1.20.2+build.4 -loader_version=0.15.0 +loader_version=0.15.11 +fabric_kotlin_version=1.10.19+kotlin.1.9.23 # Mod Properties mod_version = 3.0.0 @@ -14,4 +15,4 @@ maven_group = com.coloryr.allmusic.server archives_base_name =[fabric-1.20.2]AllMusic_Server # Dependencies -fabric_version=0.91.1+1.20.2 +fabric_version=0.91.6+1.20.2 diff --git a/fabric_1_20_2/gradle/wrapper/gradle-wrapper.properties b/fabric_1_20_2/gradle/wrapper/gradle-wrapper.properties index c30b486a..b82aa23a 100644 --- a/fabric_1_20_2/gradle/wrapper/gradle-wrapper.properties +++ b/fabric_1_20_2/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/fabric_1_20_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java b/fabric_1_20_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java index 99009125..936da51d 100644 --- a/fabric_1_20_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java +++ b/fabric_1_20_2/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.fabric; import com.coloryr.allmusic.server.AllMusicFabric; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -76,9 +77,7 @@ public class SideFabric extends ISide { protected void topSendStop() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -92,9 +91,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -102,15 +99,12 @@ public class SideFabric extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -120,17 +114,14 @@ public class SideFabric extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -138,7 +129,7 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -147,10 +138,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -159,17 +147,14 @@ public class SideFabric extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -184,10 +169,7 @@ public class SideFabric extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -204,10 +186,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -225,10 +204,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -244,10 +220,7 @@ public class SideFabric extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -263,22 +236,21 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; + if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); + switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -295,10 +267,7 @@ public class SideFabric extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -313,10 +282,7 @@ public class SideFabric extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -344,9 +310,7 @@ public class SideFabric extends ISide { var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -357,9 +321,7 @@ public class SideFabric extends ISide { public void clearHud() { try { for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/fabric_1_20_2/src/main/resources/fabric.mod.json b/fabric_1_20_2/src/main/resources/fabric.mod.json index eedc0d92..b5e1e6cf 100644 --- a/fabric_1_20_2/src/main/resources/fabric.mod.json +++ b/fabric_1_20_2/src/main/resources/fabric.mod.json @@ -27,11 +27,11 @@ ], "depends": { - "fabricloader": ">=0.15", + "fabricloader": ">=0.15.11", "fabric-api": "*", "minecraft": "~1.20", "java": ">=17", - "fabric-language-kotlin": ">=1.9.1+kotlin.1.8.10" + "fabric-language-kotlin": ">=1.10.19" }, "suggests": { diff --git a/fabric_1_20_6/.gitignore b/fabric_1_20_6/.gitignore new file mode 100644 index 00000000..c476faf2 --- /dev/null +++ b/fabric_1_20_6/.gitignore @@ -0,0 +1,40 @@ +# gradle + +.gradle/ +build/ +out/ +classes/ + +# eclipse + +*.launch + +# idea + +.idea/ +*.iml +*.ipr +*.iws + +# vscode + +.settings/ +.vscode/ +bin/ +.classpath +.project + +# macos + +*.DS_Store + +# fabric + +run/ + +# java + +hs_err_*.log +replay_*.log +*.hprof +*.jfr diff --git a/fabric_1_20_6/build.gradle b/fabric_1_20_6/build.gradle new file mode 100644 index 00000000..02d5fe0f --- /dev/null +++ b/fabric_1_20_6/build.gradle @@ -0,0 +1,92 @@ +plugins { + id 'fabric-loom' version '1.6-SNAPSHOT' + id 'maven-publish' + id "org.jetbrains.kotlin.jvm" version "1.9.23" +} + +version = project.mod_version +group = project.maven_group + +base { + archivesName = project.archives_base_name +} + +repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}" + + include modImplementation('com.squareup.okio:okio-jvm:3.0.0') + include modImplementation('com.squareup.okhttp3:okhttp:4.10.0') + include modImplementation('org.xerial:sqlite-jdbc:3.39.3.0') + + // Uncomment the following line to enable the deprecated Fabric API modules. + // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time. + + // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}" +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = 17 + } +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() + + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +jar { + from("LICENSE") { + rename { "${it}_${project.base.archivesName.get()}"} + } +} + +// configure the maven publication +publishing { + publications { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} \ No newline at end of file diff --git a/fabric_1_20_6/gradle.properties b/fabric_1_20_6/gradle.properties new file mode 100644 index 00000000..e267c622 --- /dev/null +++ b/fabric_1_20_6/gradle.properties @@ -0,0 +1,18 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.20.6 +yarn_mappings=1.20.6+build.1 +loader_version=0.15.11 +fabric_kotlin_version=1.10.19+kotlin.1.9.23 + +# Mod Properties +mod_version = 3.0.0 +maven_group = com.coloryr.allmusic.server +archives_base_name =[fabric-1.20.6]AllMusic_Server + +# Dependencies +fabric_version=0.98.0+1.20.6 diff --git a/fabric_1_20_6/gradle/wrapper/gradle-wrapper.jar b/fabric_1_20_6/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..ccebba7710deaf9f98673a68957ea02138b60d0a GIT binary patch literal 61608 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 literal 0 HcmV?d00001 diff --git a/fabric_1_20_6/gradle/wrapper/gradle-wrapper.properties b/fabric_1_20_6/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..b82aa23a --- /dev/null +++ b/fabric_1_20_6/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/fabric_1_20_6/gradlew b/fabric_1_20_6/gradlew new file mode 100644 index 00000000..79a61d42 --- /dev/null +++ b/fabric_1_20_6/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/fabric_1_20_6/gradlew.bat b/fabric_1_20_6/gradlew.bat new file mode 100644 index 00000000..93e3f59f --- /dev/null +++ b/fabric_1_20_6/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/fabric_1_20_6/settings.gradle b/fabric_1_20_6/settings.gradle new file mode 100644 index 00000000..6935efd5 --- /dev/null +++ b/fabric_1_20_6/settings.gradle @@ -0,0 +1,12 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = 'AllMusic_Server' \ No newline at end of file diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java new file mode 100644 index 00000000..340f2cef --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/AllMusicFabric.java @@ -0,0 +1,55 @@ +package com.coloryr.allmusic.server; + +import com.coloryr.allmusic.server.core.AllMusic; +import com.coloryr.allmusic.server.core.objs.enums.ComType; +import com.coloryr.allmusic.server.side.fabric.CommandFabric; +import com.coloryr.allmusic.server.side.fabric.LogFabric; +import com.coloryr.allmusic.server.side.fabric.SideFabric; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; +import okio.Buffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; + +public class AllMusicFabric implements ModInitializer { + public static MinecraftServer server; + public static final Logger LOGGER = LoggerFactory.getLogger("AllMusic_Server"); + + public static final Identifier ID = new Identifier("allmusic", "channel"); + + @Override + public void onInitialize() { + String path = "allmusic3/"; + + AllMusic.log = new LogFabric(); + AllMusic.side = new SideFabric(); + + new AllMusic().init(new File(path)); + + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) + -> CommandFabric.instance.register(dispatcher)); + + PayloadTypeRegistry.playS2C().register(PackPayload.ID, PackPayload.CODEC); + ServerLifecycleEvents.SERVER_STARTED.register((a) -> { + server = a; + + AllMusic.start(); + + Tasks.init(); + }); + + ServerLifecycleEvents.SERVER_STOPPING.register((a) -> { + AllMusic.stop(); + }); + } +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/PackPayload.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/PackPayload.java new file mode 100644 index 00000000..0034f73e --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/PackPayload.java @@ -0,0 +1,16 @@ +package com.coloryr.allmusic.server; + +import com.coloryr.allmusic.server.core.objs.enums.ComType; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +public record PackPayload(ComType type, String data, int data1) implements CustomPayload { + public static final Id ID = new CustomPayload.Id<>(AllMusicFabric.ID); + public static final PacketCodec CODEC = PacketCodec.of((value, buf) -> com.coloryr.allmusic.server.codec.PacketCodec.pack(buf, value.type, value.data, value.data1), buffer -> new PackPayload(ComType.CLEAR, null, 0)); + + @Override + public Id getId() { + return ID; + } +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/TaskItem.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/TaskItem.java new file mode 100644 index 00000000..40f9a5b9 --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/TaskItem.java @@ -0,0 +1,6 @@ +package com.coloryr.allmusic.server; + +public class TaskItem { + public int tick; + public Runnable run; +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/Tasks.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/Tasks.java new file mode 100644 index 00000000..c70e7f5e --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/Tasks.java @@ -0,0 +1,27 @@ +package com.coloryr.allmusic.server; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class Tasks { + private static final List taskItems = new CopyOnWriteArrayList<>(); + + public static void init() { + AllMusicFabric.server.addServerGuiTickable(Tasks::tick); + } + + public static void tick() { + for (var item : new ArrayList<>(taskItems)) { + item.tick--; + if (item.tick <= 0) { + taskItems.remove(item); + item.run.run(); + } + } + } + + public static void add(TaskItem item) { + taskItems.add(item); + } +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/IGetCommandOutput.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/IGetCommandOutput.java new file mode 100644 index 00000000..2bf5740b --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/IGetCommandOutput.java @@ -0,0 +1,13 @@ +package com.coloryr.allmusic.server.mixin; + +import net.minecraft.server.command.CommandOutput; +import net.minecraft.server.command.ServerCommandSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerCommandSource.class) +public interface IGetCommandOutput { + @Accessor(value = "output") + CommandOutput getOutput(); +} + diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/ServerPlayerMixin.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/ServerPlayerMixin.java new file mode 100644 index 00000000..252906a5 --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/mixin/ServerPlayerMixin.java @@ -0,0 +1,24 @@ +package com.coloryr.allmusic.server.mixin; + +import com.coloryr.allmusic.server.core.AllMusic; +import net.minecraft.network.ClientConnection; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ConnectedClientData; +import net.minecraft.server.network.ServerPlayerEntity; +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(PlayerManager.class) +public class ServerPlayerMixin { + @Inject(at = @At("HEAD"), method = "remove") + private void remove(ServerPlayerEntity entity, CallbackInfo info) { + AllMusic.removeNowPlayPlayer(entity.getName().getString()); + } + + @Inject(at = @At("TAIL"), method = "onPlayerConnect") + private void add(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) { + AllMusic.joinPlay(player.getName().getString()); + } +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/CommandFabric.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/CommandFabric.java new file mode 100644 index 00000000..d113f897 --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/CommandFabric.java @@ -0,0 +1,66 @@ +package com.coloryr.allmusic.server.side.fabric; + +import com.coloryr.allmusic.server.core.command.CommandEX; +import com.coloryr.allmusic.server.mixin.IGetCommandOutput; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; + +public class CommandFabric implements Command, Predicate, SuggestionProvider { + public static CommandFabric instance = new CommandFabric(); + + public void register(CommandDispatcher dispatcher) { + dispatcher.register(((CommandManager.literal("music").requires(this)).executes(this)) + .then(CommandManager.argument("args", StringArgumentType.greedyString()) + .suggests(this).executes(this))); + } + + @Override + public int run(CommandContext context) { + var item = context.getSource(); + var source = ((IGetCommandOutput) item).getOutput(); + + var input = context.getInput(); + var temp = input.split(" "); + var arg = new String[temp.length - 1]; + System.arraycopy(temp, 1, arg, 0, arg.length); + + CommandEX.ex(source, context.getSource().getName(), arg); + + return 0; + } + + @Override + public boolean test(ServerCommandSource stack) { + return true; + } + + @Override + public CompletableFuture getSuggestions(CommandContext context, SuggestionsBuilder builder) { + var input = context.getInput(); + var temp = input.split(" "); + var arg = new String[input.endsWith(" ") ? temp.length : temp.length - 1]; + System.arraycopy(temp, 1, arg, 0, temp.length - 1); + + if (input.endsWith(" ")) + builder = builder.createOffset(builder.getInput().lastIndexOf(32) + 1); + + List results = CommandEX.getTabList(context.getSource().getName(), arg); + + for (String s : results) { + builder.suggest(s); + } + + return builder.buildFuture(); + } +} \ No newline at end of file diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/FabricApi.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/FabricApi.java new file mode 100644 index 00000000..8cd973eb --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/FabricApi.java @@ -0,0 +1,48 @@ +package com.coloryr.allmusic.server.side.fabric; + +import com.coloryr.allmusic.server.AllMusicFabric; +import com.coloryr.allmusic.server.core.AllMusic; +import net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket; +import net.minecraft.server.command.CommandOutput; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; + +public class FabricApi { + + public static void sendMessageRun(Object obj, String message, String end, String command) { + CommandOutput sender = (CommandOutput) obj; + MutableText send = Text.literal(message); + var endText = Text.literal(end); + endText.setStyle(endText.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command))); + send.append(endText); + sender.sendMessage(send); + } + + public static void sendMessageSuggest(Object obj, String message, String end, String command) { + CommandOutput sender = (CommandOutput) obj; + MutableText send = Text.literal(message); + var endText = Text.literal(end); + endText.setStyle(endText.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command))); + send.append(endText); + sender.sendMessage(send); + } + + public static void sendBar(ServerPlayerEntity player, String message) { + var pack = new OverlayMessageS2CPacket(Text.literal(message)); + player.networkHandler.sendPacket(pack); + } + + public static void sendMessageBqRun(String message, String end, String command) { + MutableText send = Text.literal(message); + MutableText endText = Text.literal(end); + endText.setStyle(endText.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command))); + send.append(endText); + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (!AllMusic.getConfig().mutePlayer.contains(player.getName().getString())) { + player.sendMessage(send, false); + } + } + } +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/LogFabric.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/LogFabric.java new file mode 100644 index 00000000..76eb6745 --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/LogFabric.java @@ -0,0 +1,16 @@ +package com.coloryr.allmusic.server.side.fabric; + +import com.coloryr.allmusic.server.AllMusicFabric; +import com.coloryr.allmusic.server.core.side.IMyLogger; + +public class LogFabric implements IMyLogger { + @Override + public void warning(String data) { + AllMusicFabric.LOGGER.warn(data); + } + + @Override + public void info(String data) { + AllMusicFabric.LOGGER.info(data); + } +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java new file mode 100644 index 00000000..06ea6d90 --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/SideFabric.java @@ -0,0 +1,434 @@ +package com.coloryr.allmusic.server.side.fabric; + +import com.coloryr.allmusic.server.AllMusicFabric; +import com.coloryr.allmusic.server.PackPayload; +import com.coloryr.allmusic.server.TaskItem; +import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; +import com.coloryr.allmusic.server.core.AllMusic; +import com.coloryr.allmusic.server.core.objs.config.SaveObj; +import com.coloryr.allmusic.server.core.objs.enums.ComType; +import com.coloryr.allmusic.server.core.objs.enums.HudType; +import com.coloryr.allmusic.server.core.objs.music.MusicObj; +import com.coloryr.allmusic.server.core.objs.music.SongInfoObj; +import com.coloryr.allmusic.server.core.side.ISide; +import com.coloryr.allmusic.server.core.utils.HudUtils; +import com.coloryr.allmusic.server.side.fabric.event.MusicAddEvent; +import com.coloryr.allmusic.server.side.fabric.event.MusicPlayEvent; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.server.command.CommandOutput; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.List; + +public class SideFabric extends ISide { + + @Override + public void reload() { + String path = "allmusic/"; + new AllMusic().init(new File(path)); + } + + @Override + public int getAllPlayer() { + return AllMusicFabric.server.getCurrentPlayerCount(); + } + + @Override + public void runTask(Runnable run) { + AllMusicFabric.server.execute(run); + } + + @Override + public void runTask(Runnable run1, int delay) { + Tasks.add(new TaskItem() {{ + tick = delay; + run = run1; + }}); + } + + @Override + public boolean checkPermission(String player, String permission) { + var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + if (player1 == null) + return false; + + return player1.hasPermissionLevel(2); + } + + @Override + public boolean needPlay() { + int online = getAllPlayer(); + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (AllMusic.getConfig().mutePlayer.contains(player.getName().getString())) { + online--; + } + } + return online > 0; + } + + @Override + protected void topSendStop() { + try { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + send(player, new PackPayload(ComType.STOP, null, 0)); + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); + e.printStackTrace(); + } + } + + @Override + protected void topSendStop(String name) { + try { + var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + if (player == null) + return; + send(player, new PackPayload(ComType.STOP, null, 0)); + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendMusic(String data) { + try { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (AllMusic.isOK(player.getName().getString(), null, false)) + continue; + send(player, new PackPayload(ComType.PLAY, data, 0)); + AllMusic.addNowPlayPlayer(player.getName().getString()); + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); + e.printStackTrace(); + } + } + + @Override + protected void topSendMusic(String player, String data) { + try { + var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + if (player1 == null) + return; + if (AllMusic.isOK(player, null, false)) + return; + send(player1, new PackPayload(ComType.PLAY, data, 0)); + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendPic(String data) { + try { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (AllMusic.isOK(player.getName().getString(), null, true)) + continue; + String name = player.getName().getString(); + SaveObj obj = HudUtils.get(name); + if (!obj.pic.enable) + continue; + send(player, new PackPayload(ComType.IMG, data, 0)); + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendPic(String player, String data) { + try { + var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + if (player1 == null) + return; + if (AllMusic.isOK(player1.getName().getString(), null, true)) + return; + send(player1, new PackPayload(ComType.IMG, data, 0)); + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendPos(String player, int pos) { + try { + var player1 = AllMusicFabric.server.getPlayerManager().getPlayer(player); + if (player1 == null) + return; + if (AllMusic.isOK(player1.getName().getString(), null, true)) + return; + send(player1, new PackPayload(ComType.POS, null, pos)); + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); + e.printStackTrace(); + } + } + + @Override + public void sendHudLyric(String data) { + try { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (AllMusic.isOK(player.getName().getString(), null, true)) + continue; + String name = player.getName().getString(); + SaveObj obj = HudUtils.get(name); + if (!obj.lyric.enable) + continue; + send(player, new PackPayload(ComType.LYRIC, data, 0)); + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendHudInfo(String data) { + try { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (AllMusic.isOK(player.getName().getString(), null, true)) + continue; + String name = player.getName().getString(); + SaveObj obj = HudUtils.get(name); + if (!obj.info.enable) + continue; + send(player, new PackPayload(ComType.INFO, data, 0)); + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendHudPos(String name) { + try { + var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + if (player == null) + return; + SaveObj obj = HudUtils.get(name); + String data = AllMusic.gson.toJson(obj); + send(player, new PackPayload(ComType.HUD, data, 0)); + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendHud(String name, HudType pos, String data) { + try { + if (pos == HudType.PIC) { + return; + } + var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + if (player == null) + return; + + if (AllMusic.isOK(name, null, true)) + return; + + switch (pos) { + case INFO: + send(player, new PackPayload(ComType.INFO, data, 0)); + break; + case LIST: + send(player, new PackPayload(ComType.LIST, data, 0)); + break; + case LYRIC: + send(player, new PackPayload(ComType.LYRIC, data, 0)); + break; + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendHudList(String data) { + try { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (AllMusic.isOK(player.getName().getString(), null, true)) + continue; + String name = player.getName().getString(); + SaveObj obj = HudUtils.get(name); + if (!obj.list.enable) + continue; + send(player, new PackPayload(ComType.LIST, data, 0)); + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); + e.printStackTrace(); + } + } + + @Override + public void sendHudUtilsAll() { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + String Name = player.getName().getString(); + try { + SaveObj obj = HudUtils.get(Name); + String data = AllMusic.gson.toJson(obj); + send(player, new PackPayload(ComType.HUD, data, 0)); + } catch (Exception e1) { + AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); + e1.printStackTrace(); + } + } + } + + @Override + public void sendBar(String data) { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + try { + if (AllMusic.isOK(player.getName().getString(), null, true)) + continue; + FabricApi.sendBar(player, data); + } catch (Exception e1) { + AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); + e1.printStackTrace(); + } + } + } + + @Override + public void clearHud(String name) { + try { + var player = AllMusicFabric.server.getPlayerManager().getPlayer(name); + if (player == null) + return; + send(player, new PackPayload(ComType.CLEAR, null, 0)); + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); + e.printStackTrace(); + } + } + + @Override + public void clearHud() { + try { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + send(player, new PackPayload(ComType.CLEAR, null, 0)); + } + } catch (Exception e) { + AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); + e.printStackTrace(); + } + } + + @Override + public void bq(String data) { + if (AllMusic.getConfig().messageLimit + && data.length() > AllMusic.getConfig().messageLimitSize) { + data = data.substring(0, AllMusic.getConfig().messageLimitSize - 1) + "..."; + } + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (!AllMusic.getConfig().mutePlayer.contains(player.getName().getString())) { + player.sendMessage(Text.of(data), false); + } + } + } + + @Override + public void bqRun(String message, String end, String command) { + FabricApi.sendMessageBqRun(message, end, command); + } + + @Override + public void bqt(String data) { + if (AllMusic.getConfig().messageLimit + && data.length() > AllMusic.getConfig().messageLimitSize) { + data = data.substring(0, AllMusic.getConfig().messageLimitSize - 1) + "..."; + } + var finalData = Text.of(data); + runTask(() -> { + for (var player : AllMusicFabric.server.getPlayerManager().getPlayerList()) { + if (!AllMusic.getConfig().mutePlayer.contains(player.getName().getString())) { + player.sendMessage(finalData, false); + } + } + }); + } + + @Override + public void sendMessaget(Object obj, String message) { + runTask(() -> ((CommandOutput) obj).sendMessage(Text.of(message))); + } + + @Override + public void sendMessage(Object obj, String message) { + CommandOutput sender = (CommandOutput) obj; + sender.sendMessage(Text.of(message)); + } + + @Override + public void sendMessageRun(Object obj, String message, String end, String command) { + FabricApi.sendMessageRun(obj, message, end, command); + } + + @Override + public void sendMessageSuggest(Object obj, String message, String end, String command) { + FabricApi.sendMessageSuggest(obj, message, end, command); + } + + @Override + public boolean onMusicPlay(SongInfoObj obj) { + return MusicPlayEvent.EVENT.invoker().interact(obj) != ActionResult.PASS; + } + + @Override + public boolean onMusicAdd(Object obj, MusicObj music) { + return MusicAddEvent.EVENT.invoker().interact((ServerPlayerEntity) obj, music) != ActionResult.PASS; + } + + @Override + public void updateInfo() { + + } + + @Override + public void updateLyric() { + + } + + @Override + public void ping() { + + } + + @Override + public List getPlayerList() { + return List.of(); + } + + private void send(ServerPlayerEntity players, PackPayload data) { + if (players == null) + return; + try { + runTask(() -> ServerPlayNetworking.send(players, data)); + } catch (Exception e) { + AllMusic.log.warning("§c数据发送发生错误"); + e.printStackTrace(); + } + } + + private void writeString(ByteBuf buf, String data) { + byte[] temp = data.getBytes(StandardCharsets.UTF_8); + buf.writeInt(temp.length) + .writeBytes(temp); + } +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicAddEvent.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicAddEvent.java new file mode 100644 index 00000000..708a509e --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicAddEvent.java @@ -0,0 +1,24 @@ +package com.coloryr.allmusic.server.side.fabric.event; + +import com.coloryr.allmusic.server.core.objs.music.MusicObj; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.ActionResult; + +public interface MusicAddEvent { + Event EVENT = EventFactory.createArrayBacked(MusicAddEvent.class, + (listeners) -> (player, music) -> { + for (MusicAddEvent listener : listeners) { + ActionResult result = listener.interact(player, music); + + if (result != ActionResult.PASS) { + return result; + } + } + + return ActionResult.PASS; + }); + + ActionResult interact(ServerPlayerEntity player, MusicObj music); +} diff --git a/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicPlayEvent.java b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicPlayEvent.java new file mode 100644 index 00000000..45c91861 --- /dev/null +++ b/fabric_1_20_6/src/main/java/com/coloryr/allmusic/server/side/fabric/event/MusicPlayEvent.java @@ -0,0 +1,23 @@ +package com.coloryr.allmusic.server.side.fabric.event; + +import com.coloryr.allmusic.server.core.objs.music.SongInfoObj; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.util.ActionResult; + +public interface MusicPlayEvent { + Event EVENT = EventFactory.createArrayBacked(MusicPlayEvent.class, + (listeners) -> (music) -> { + for (MusicPlayEvent listener : listeners) { + ActionResult result = listener.interact(music); + + if (result != ActionResult.PASS) { + return result; + } + } + + return ActionResult.PASS; + }); + + ActionResult interact(SongInfoObj music); +} diff --git a/fabric_1_20_6/src/main/resources/allmusic_server.mixins.json b/fabric_1_20_6/src/main/resources/allmusic_server.mixins.json new file mode 100644 index 00000000..6aef62a7 --- /dev/null +++ b/fabric_1_20_6/src/main/resources/allmusic_server.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.coloryr.allmusic.server.mixin", + "compatibilityLevel": "JAVA_17", + "server": [ + + ], + "mixins": [ + "IGetCommandOutput", + "ServerPlayerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric_1_20_6/src/main/resources/assets/allmusic_server/icon.png b/fabric_1_20_6/src/main/resources/assets/allmusic_server/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b5fa790ca8e14661cd169aa56e1ca5dd818a76 GIT binary patch literal 32781 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 literal 0 HcmV?d00001 diff --git a/fabric_1_20_6/src/main/resources/fabric.mod.json b/fabric_1_20_6/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..335f4323 --- /dev/null +++ b/fabric_1_20_6/src/main/resources/fabric.mod.json @@ -0,0 +1,39 @@ +{ + "schemaVersion": 1, + "id": "allmusic_server", + "version": "${version}", + + "name": "AllMusic Server", + "description": "AllMusic Server Mod", + "authors": [ + "Color_yr" + ], + "contact": { + "homepage": "https://github.com/Coloryr/AllMusic_Server", + "sources": "https://github.com/Coloryr/AllMusic_Server" + }, + + "license": "GPL-3.0", + "icon": "assets/allmusic_server/icon.png", + + "environment": "*", + "entrypoints": { + "main": [ + "com.coloryr.allmusic.server.AllMusicFabric" + ] + }, + "mixins": [ + "allmusic_server.mixins.json" + ], + + "depends": { + "fabricloader": ">=0.15.11", + "minecraft": "~1.20.6", + "java": ">=21", + "fabric-api": "*", + "fabric-language-kotlin": ">=1.9.23" + }, + "suggests": { + + } +} diff --git a/folia/src/main/java/com/coloryr/allmusic/server/side/folia/SideFolia.java b/folia/src/main/java/com/coloryr/allmusic/server/side/folia/SideFolia.java index c41563ff..6ba03fd4 100644 --- a/folia/src/main/java/com/coloryr/allmusic/server/side/folia/SideFolia.java +++ b/folia/src/main/java/com/coloryr/allmusic/server/side/folia/SideFolia.java @@ -1,6 +1,7 @@ package com.coloryr.allmusic.server.side.folia; import com.coloryr.allmusic.server.AllMusicFolia; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -39,12 +40,7 @@ public class SideFolia extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -62,12 +58,7 @@ public class SideFolia extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -83,14 +74,9 @@ public class SideFolia extends ISide { return; if (AllMusic.isOK(name, null, false)) return; - SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -110,21 +96,17 @@ public class SideFolia extends ISide { if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -141,12 +123,7 @@ public class SideFolia extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -161,11 +138,7 @@ public class SideFolia extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -192,17 +165,12 @@ public class SideFolia extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (Player player : Bukkit.getOnlinePlayers()) { if (AllMusic.isOK(player.getName(), null, false)) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName()); } } catch (Exception e) { @@ -212,18 +180,14 @@ public class SideFolia extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { Player player1 = Bukkit.getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -231,7 +195,7 @@ public class SideFolia extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (Player player : Bukkit.getOnlinePlayers()) { if (AllMusic.isOK(player.getName(), null, true)) @@ -240,12 +204,7 @@ public class SideFolia extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -254,18 +213,14 @@ public class SideFolia extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { Player player1 = Bukkit.getPlayer(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -280,11 +235,7 @@ public class SideFolia extends ISide { return; if (AllMusic.isOK(player1.getName(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -295,10 +246,7 @@ public class SideFolia extends ISide { protected void topSendStop() { try { for (Player player : Bukkit.getOnlinePlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -312,10 +260,7 @@ public class SideFolia extends ISide { Player player = Bukkit.getPlayer(name); if (player == null) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -328,11 +273,7 @@ public class SideFolia extends ISide { Player player = Bukkit.getPlayer(name); if (player == null) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -343,10 +284,7 @@ public class SideFolia extends ISide { public void clearHud() { try { for (Player player : Bukkit.getOnlinePlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); @@ -529,10 +467,4 @@ public class SideFolia extends ISide { e.printStackTrace(); } } - - private void writeString(ByteBuf buf, String data) { - byte[] temp = data.getBytes(StandardCharsets.UTF_8); - buf.writeInt(temp.length) - .writeBytes(temp); - } } diff --git a/forge_1_12_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/forge_1_12_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index 7573b7e0..61586f00 100644 --- a/forge_1_12_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/forge_1_12_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -19,8 +20,6 @@ import io.netty.buffer.Unpooled; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.client.CPacketCustomPayload; -import net.minecraft.network.play.server.SPacketCustomPayload; import net.minecraft.util.text.TextComponentString; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; @@ -82,9 +81,7 @@ public class SideForge extends ISide { protected void topSendStop() { try { for (EntityPlayerMP player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -98,9 +95,7 @@ public class SideForge extends ISide { EntityPlayerMP player = AllMusicForge.server.getPlayerList().getPlayerByUsername(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -108,15 +103,12 @@ public class SideForge extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (EntityPlayerMP player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName(), null, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName()); } } catch (Exception e) { @@ -126,17 +118,14 @@ public class SideForge extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { EntityPlayerMP player1 = AllMusicForge.server.getPlayerList().getPlayerByUsername(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -144,7 +133,7 @@ public class SideForge extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (EntityPlayerMP player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName(), null, true)) @@ -153,10 +142,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -165,17 +151,14 @@ public class SideForge extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { EntityPlayerMP player1 = AllMusicForge.server.getPlayerList().getPlayerByUsername(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -190,10 +173,7 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(player1.getName(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -210,10 +190,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -231,10 +208,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -250,10 +224,7 @@ public class SideForge extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -271,20 +242,17 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -301,10 +269,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -319,10 +284,7 @@ public class SideForge extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = new Gson().toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -350,9 +312,7 @@ public class SideForge extends ISide { EntityPlayerMP player = AllMusicForge.server.getPlayerList().getPlayerByUsername(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -363,9 +323,7 @@ public class SideForge extends ISide { public void clearHud() { try { for (EntityPlayerMP player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/forge_1_16_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/forge_1_16_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index 5b33ebf7..325d5987 100644 --- a/forge_1_16_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/forge_1_16_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -82,9 +83,7 @@ public class SideForge extends ISide { protected void topSendStop() { try { for (ServerPlayerEntity player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -98,9 +97,7 @@ public class SideForge extends ISide { ServerPlayerEntity player = AllMusicForge.server.getPlayerList().getPlayerByName(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -108,15 +105,12 @@ public class SideForge extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (ServerPlayerEntity player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -126,17 +120,14 @@ public class SideForge extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { ServerPlayerEntity player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -144,7 +135,7 @@ public class SideForge extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (ServerPlayerEntity player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -153,10 +144,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -165,17 +153,14 @@ public class SideForge extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { ServerPlayerEntity player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -190,10 +175,7 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -210,10 +192,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -231,10 +210,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -250,10 +226,7 @@ public class SideForge extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -271,20 +244,17 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -301,10 +271,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -319,10 +286,7 @@ public class SideForge extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = new Gson().toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -350,9 +314,7 @@ public class SideForge extends ISide { ServerPlayerEntity player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -363,9 +325,7 @@ public class SideForge extends ISide { public void clearHud() { try { for (ServerPlayerEntity player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); @@ -439,7 +399,7 @@ public class SideForge extends ISide { MusicAddEvent event = new MusicAddEvent(music, (CommandSource) obj); return MinecraftForge.EVENT_BUS.post(event); } - +// @Override public void updateInfo() { diff --git a/forge_1_18_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/forge_1_18_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index c6d88ba3..2c4767f7 100644 --- a/forge_1_18_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/forge_1_18_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -81,9 +82,7 @@ public class SideForge extends ISide { protected void topSendStop() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -97,9 +96,7 @@ public class SideForge extends ISide { ServerPlayer player = AllMusicForge.server.getPlayerList().getPlayerByName(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -107,15 +104,12 @@ public class SideForge extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -125,17 +119,14 @@ public class SideForge extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -143,7 +134,7 @@ public class SideForge extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -152,10 +143,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -164,17 +152,14 @@ public class SideForge extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -189,10 +174,7 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -209,10 +191,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -230,10 +209,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -249,10 +225,7 @@ public class SideForge extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -270,20 +243,17 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -300,10 +270,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -318,10 +285,7 @@ public class SideForge extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = new Gson().toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -349,9 +313,7 @@ public class SideForge extends ISide { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -362,9 +324,7 @@ public class SideForge extends ISide { public void clearHud() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/forge_1_19_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/forge_1_19_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index 7ca0eb5b..c4773993 100644 --- a/forge_1_19_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/forge_1_19_2/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -80,9 +81,7 @@ public class SideForge extends ISide { protected void topSendStop() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -96,9 +95,7 @@ public class SideForge extends ISide { ServerPlayer player = AllMusicForge.server.getPlayerList().getPlayerByName(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -106,15 +103,12 @@ public class SideForge extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -124,17 +118,14 @@ public class SideForge extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -142,7 +133,7 @@ public class SideForge extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -151,10 +142,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -163,17 +151,14 @@ public class SideForge extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -188,10 +173,7 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -208,10 +190,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -229,10 +208,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -248,10 +224,7 @@ public class SideForge extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -269,20 +242,17 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -299,10 +269,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -317,10 +284,7 @@ public class SideForge extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = new Gson().toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -348,9 +312,7 @@ public class SideForge extends ISide { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -361,9 +323,7 @@ public class SideForge extends ISide { public void clearHud() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/forge_1_19_3/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/forge_1_19_3/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index 7ca0eb5b..c4773993 100644 --- a/forge_1_19_3/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/forge_1_19_3/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -80,9 +81,7 @@ public class SideForge extends ISide { protected void topSendStop() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -96,9 +95,7 @@ public class SideForge extends ISide { ServerPlayer player = AllMusicForge.server.getPlayerList().getPlayerByName(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -106,15 +103,12 @@ public class SideForge extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -124,17 +118,14 @@ public class SideForge extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -142,7 +133,7 @@ public class SideForge extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -151,10 +142,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -163,17 +151,14 @@ public class SideForge extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -188,10 +173,7 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -208,10 +190,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -229,10 +208,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -248,10 +224,7 @@ public class SideForge extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -269,20 +242,17 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -299,10 +269,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -317,10 +284,7 @@ public class SideForge extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = new Gson().toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -348,9 +312,7 @@ public class SideForge extends ISide { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -361,9 +323,7 @@ public class SideForge extends ISide { public void clearHud() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/forge_1_20/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/forge_1_20/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index 38762dbe..3d12f638 100644 --- a/forge_1_20/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/forge_1_20/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -78,9 +79,7 @@ public class SideForge extends ISide { protected void topSendStop() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -94,9 +93,7 @@ public class SideForge extends ISide { ServerPlayer player = AllMusicForge.server.getPlayerList().getPlayerByName(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -104,15 +101,12 @@ public class SideForge extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -122,17 +116,14 @@ public class SideForge extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -140,7 +131,7 @@ public class SideForge extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -149,10 +140,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -161,17 +149,14 @@ public class SideForge extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -186,10 +171,7 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -206,10 +188,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -227,10 +206,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -246,10 +222,7 @@ public class SideForge extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); @@ -267,20 +240,17 @@ public class SideForge extends ISide { return; if (AllMusic.isOK(name, null, true)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - send(player, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -297,10 +267,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -315,10 +282,7 @@ public class SideForge extends ISide { try { SaveObj obj = HudUtils.get(Name); String data = new Gson().toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -346,9 +310,7 @@ public class SideForge extends ISide { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -359,9 +321,7 @@ public class SideForge extends ISide { public void clearHud() { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); diff --git a/link.cmd b/link.cmd index b3c347f7..9ad1e6ca 100644 --- a/link.cmd +++ b/link.cmd @@ -8,10 +8,19 @@ setlocal enabledelayedexpansion set array=folia server_top server forge_1_20 forge_1_19_3 ^ forge_1_19_2 forge_1_18_2 forge_1_16_5 forge_1_12_2 ^ fabric_1_20_2 fabric_1_20 fabric_1_19_3 fabric_1_19_2 fabric_1_18_2 ^ -fabric_1_16_5 neoforge_1_20_4 neoforge_1_20_5 +fabric_1_16_5 fabric_1_20_6 neoforge_1_20_4 neoforge_1_20_5 for %%i in (%array%) do ( if not exist "%%i\src\main\java\com\coloryr\allmusic\server\core" mklink /j "%%i\src\main\java\com\coloryr\allmusic\server\core" "core" if not exist "%%i\build" mklink /j "%%i\build" "build" if not exist "%%i\.gradle" mklink /j "%%i\.gradle" ".gradle" -) \ No newline at end of file +) + +set array1=folia server_top forge_1_20 forge_1_19_3 ^ +forge_1_19_2 forge_1_18_2 forge_1_16_5 forge_1_12_2 ^ +fabric_1_20_2 fabric_1_20 fabric_1_19_3 fabric_1_19_2 fabric_1_18_2 ^ +fabric_1_16_5 fabric_1_20_6 neoforge_1_20_4 neoforge_1_20_5 + +for %%i in (%array%) do ( + if not exist "%%i\src\main\java\com\coloryr\allmusic\server\codec" mklink /j "%%i\src\main\java\com\coloryr\allmusic\server\codec" "codec" +) diff --git a/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java b/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java index c5132faa..f4153fa4 100644 --- a/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java +++ b/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java @@ -1,39 +1,17 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.objs.enums.ComType; -import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; -import java.nio.charset.StandardCharsets; - public record PackData(ComType cmd, String data, int data1) implements CustomPacketPayload { @Override public void write(@NotNull FriendlyByteBuf pack) { - pack.writeByte(cmd.ordinal()); - switch (cmd) - { - case IMG: - case PLAY: - case INFO: - case LIST: - case LYRIC: - case HUD: - writeString(pack, data); - break; - case POS: - pack.writeInt(data1); - break; - } - } - - private void writeString(ByteBuf buf, String data) { - byte[] temp = data.getBytes(StandardCharsets.UTF_8); - buf.writeInt(temp.length) - .writeBytes(temp); + PacketCodec.pack(pack, cmd, data, data1); } @Override diff --git a/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index 590f8c1c..173febf8 100644 --- a/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/neoforge_1_20_4/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -3,6 +3,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; import com.coloryr.allmusic.server.TaskItem; import com.coloryr.allmusic.server.Tasks; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; import com.coloryr.allmusic.server.core.objs.enums.ComType; @@ -102,12 +103,12 @@ public class SideForge extends ISide { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, false)) continue; - send(player, new PackData(ComType.PLAY, url, 0)); + send(player, new PackData(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName().getString()); } } catch (Exception e) { @@ -117,14 +118,14 @@ public class SideForge extends ISide { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player, null, false)) return; - send(player1, new PackData(ComType.PLAY, url, 0)); + send(player1, new PackData(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -132,7 +133,7 @@ public class SideForge extends ISide { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (ServerPlayer player : AllMusicForge.server.getPlayerList().getPlayers()) { if (AllMusic.isOK(player.getName().getString(), null, true)) @@ -141,7 +142,7 @@ public class SideForge extends ISide { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - send(player, new PackData(ComType.IMG, url, 0)); + send(player, new PackData(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -150,14 +151,14 @@ public class SideForge extends ISide { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { ServerPlayer player1 = AllMusicForge.server.getPlayerList().getPlayerByName(player); if (player1 == null) return; if (AllMusic.isOK(player1.getName().getString(), null, true)) return; - send(player1, new PackData(ComType.IMG, url, 0)); + send(player1, new PackData(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -223,7 +224,7 @@ public class SideForge extends ISide { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - send(player, new PackData(ComType.INFO, data, 0)); + send(player, new PackData(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c界面位置发送出错"); e.printStackTrace(); diff --git a/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java b/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java index b67c1b8d..2e742cd7 100644 --- a/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java +++ b/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/PackData.java @@ -1,6 +1,7 @@ package com.coloryr.allmusic.server.side.forge; import com.coloryr.allmusic.server.AllMusicForge; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.objs.enums.ComType; import io.netty.buffer.ByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -23,21 +24,7 @@ public record PackData(ComType cmd, String data, int data1) implements CustomPac @Override public void encode(RegistryFriendlyByteBuf pack, PackData buffer) { - pack.writeByte(buffer.cmd.ordinal()); - switch (buffer.cmd) - { - case IMG: - case PLAY: - case INFO: - case LIST: - case LYRIC: - case HUD: - writeString(pack, buffer.data); - break; - case POS: - pack.writeInt(buffer.data1); - break; - } + PacketCodec.pack(pack, buffer.cmd, buffer.data, buffer.data1); } private void writeString(ByteBuf buf, String data) { diff --git a/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java b/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java index c617f570..6edb484b 100644 --- a/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java +++ b/neoforge_1_20_5/src/main/java/com/coloryr/allmusic/server/side/forge/SideForge.java @@ -14,8 +14,6 @@ import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.side.forge.event.MusicAddEvent; import com.coloryr.allmusic.server.side.forge.event.MusicPlayEvent; import com.google.gson.Gson; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.commands.CommandSource; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; diff --git a/remove.cmd b/remove.cmd index 3de5a982..429c7b6f 100644 --- a/remove.cmd +++ b/remove.cmd @@ -8,7 +8,7 @@ setlocal enabledelayedexpansion set array=folia server_top server forge_1_20 forge_1_19_3 ^ forge_1_19_2 forge_1_18_2 forge_1_16_5 forge_1_12_2 ^ fabric_1_20_2 fabric_1_20 fabric_1_19_3 fabric_1_19_2 fabric_1_18_2 ^ -fabric_1_16_5 neoforge_1_20_4 neoforge_1_20_5 +fabric_1_16_5 fabric_1_20_6 neoforge_1_20_4 neoforge_1_20_5 for %%i in (%array%) do ( if exist "%%i\src\main\java\com\coloryr\allmusic\server\core" rmdir "%%i\src\main\java\com\coloryr\allmusic\server\core" "core" @@ -16,4 +16,13 @@ for %%i in (%array%) do ( if exist "%%i\.gradle" rmdir /s /q "%%i\.gradle" ".gradle" ) +set array1=folia server_top forge_1_20 forge_1_19_3 ^ +forge_1_19_2 forge_1_18_2 forge_1_16_5 forge_1_12_2 ^ +fabric_1_20_2 fabric_1_20 fabric_1_19_3 fabric_1_19_2 fabric_1_18_2 ^ +fabric_1_16_5 fabric_1_20_6 neoforge_1_20_4 neoforge_1_20_5 + +for %%i in (%array%) do ( + if exist "%%i\src\main\java\com\coloryr\allmusic\server\codec" rmdir "%%i\src\main\java\com\coloryr\allmusic\server\codec" "codec" +) + endlocal \ No newline at end of file diff --git a/server_top/src/main/java/com/coloryr/allmusic/server/side/bc/SideBC.java b/server_top/src/main/java/com/coloryr/allmusic/server/side/bc/SideBC.java index e8580d06..bfa98cfb 100644 --- a/server_top/src/main/java/com/coloryr/allmusic/server/side/bc/SideBC.java +++ b/server_top/src/main/java/com/coloryr/allmusic/server/side/bc/SideBC.java @@ -1,22 +1,22 @@ package com.coloryr.allmusic.server.side.bc; import com.coloryr.allmusic.server.AllMusicBC; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; -import com.coloryr.allmusic.server.core.objs.enums.HudType; -import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.core.music.play.PlayMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; +import com.coloryr.allmusic.server.core.objs.enums.ComType; +import com.coloryr.allmusic.server.core.objs.enums.HudType; import com.coloryr.allmusic.server.core.objs.music.MusicObj; import com.coloryr.allmusic.server.core.objs.music.SongInfoObj; -import com.coloryr.allmusic.server.core.objs.enums.ComType; import com.coloryr.allmusic.server.core.side.ISide; import com.coloryr.allmusic.server.core.sql.IEconomy; +import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.side.bc.event.MusicAddEvent; import com.coloryr.allmusic.server.side.bc.event.MusicPlayEvent; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; @@ -26,7 +26,6 @@ import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; -import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; @@ -147,10 +146,7 @@ public class SideBC extends ISide implements IEconomy { SaveObj obj = HudUtils.get(player.getName()); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -167,10 +163,7 @@ public class SideBC extends ISide implements IEconomy { SaveObj obj = HudUtils.get(player.getName()); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -188,10 +181,7 @@ public class SideBC extends ISide implements IEconomy { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -205,10 +195,7 @@ public class SideBC extends ISide implements IEconomy { try { SaveObj obj = HudUtils.get(player.getName()); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -230,16 +217,13 @@ public class SideBC extends ISide implements IEconomy { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) { String server = player.getServer() == null ? null : player.getServer().getInfo().getName(); if (AllMusic.isOK(player.getName(), server, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getName()); } } catch (Exception e) { @@ -249,7 +233,7 @@ public class SideBC extends ISide implements IEconomy { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { ProxiedPlayer player1 = ProxyServer.getInstance().getPlayer(player); if (player1 == null) @@ -257,11 +241,7 @@ public class SideBC extends ISide implements IEconomy { String server = player1.getServer() == null ? null : player1.getServer().getInfo().getName(); if (AllMusic.isOK(player1.getName(), server, false)) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -280,10 +260,7 @@ public class SideBC extends ISide implements IEconomy { SaveObj obj = HudUtils.get(player); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -302,21 +279,17 @@ public class SideBC extends ISide implements IEconomy { if (ok(player1)) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player1, PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player1, PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player1, PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player1, buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); e.printStackTrace(); @@ -324,7 +297,7 @@ public class SideBC extends ISide implements IEconomy { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) { if (ok(player)) @@ -333,10 +306,7 @@ public class SideBC extends ISide implements IEconomy { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -345,17 +315,14 @@ public class SideBC extends ISide implements IEconomy { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { ProxiedPlayer player1 = ProxyServer.getInstance().getPlayer(player); if (player1 == null) return; if (ok(player1)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); e.printStackTrace(); @@ -370,10 +337,7 @@ public class SideBC extends ISide implements IEconomy { return; if (ok(player1)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲位置指令发送出错"); e.printStackTrace(); @@ -384,9 +348,7 @@ public class SideBC extends ISide implements IEconomy { protected void topSendStop() { try { for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -400,9 +362,7 @@ public class SideBC extends ISide implements IEconomy { ProxiedPlayer player = ProxyServer.getInstance().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -415,9 +375,7 @@ public class SideBC extends ISide implements IEconomy { ProxiedPlayer player = ProxyServer.getInstance().getPlayer(name); if (player == null) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -429,9 +387,7 @@ public class SideBC extends ISide implements IEconomy { try { Collection values = ProxyServer.getInstance().getPlayers(); for (ProxiedPlayer player : values) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); @@ -689,10 +645,4 @@ public class SideBC extends ISide implements IEconomy { return false; } - - private static void writeString(ByteBuf buf, String text) { - byte[] temp = text.getBytes(StandardCharsets.UTF_8); - buf.writeInt(temp.length); - buf.writeBytes(temp); - } } diff --git a/server_top/src/main/java/com/coloryr/allmusic/server/side/velocity/SideVelocity.java b/server_top/src/main/java/com/coloryr/allmusic/server/side/velocity/SideVelocity.java index 3cd1a5e0..7505b75c 100644 --- a/server_top/src/main/java/com/coloryr/allmusic/server/side/velocity/SideVelocity.java +++ b/server_top/src/main/java/com/coloryr/allmusic/server/side/velocity/SideVelocity.java @@ -1,16 +1,17 @@ package com.coloryr.allmusic.server.side.velocity; import com.coloryr.allmusic.server.AllMusicVelocity; +import com.coloryr.allmusic.server.codec.PacketCodec; import com.coloryr.allmusic.server.core.AllMusic; -import com.coloryr.allmusic.server.core.objs.enums.HudType; -import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.core.music.play.PlayMusic; import com.coloryr.allmusic.server.core.objs.config.SaveObj; +import com.coloryr.allmusic.server.core.objs.enums.ComType; +import com.coloryr.allmusic.server.core.objs.enums.HudType; import com.coloryr.allmusic.server.core.objs.music.MusicObj; import com.coloryr.allmusic.server.core.objs.music.SongInfoObj; -import com.coloryr.allmusic.server.core.objs.enums.ComType; import com.coloryr.allmusic.server.core.side.ISide; import com.coloryr.allmusic.server.core.sql.IEconomy; +import com.coloryr.allmusic.server.core.utils.HudUtils; import com.coloryr.allmusic.server.side.velocity.event.MusicAddEvent; import com.coloryr.allmusic.server.side.velocity.event.MusicPlayEvent; import com.google.common.io.ByteArrayDataOutput; @@ -20,7 +21,6 @@ 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 io.netty.buffer.Unpooled; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; @@ -131,6 +131,12 @@ public class SideVelocity extends ISide implements IEconomy { server.sendPluginMessage(AllMusicVelocity.channelBC, out.toByteArray()); } + private static void writeString(ByteBuf buf, String text) { + byte[] temp = text.getBytes(StandardCharsets.UTF_8); + buf.writeInt(temp.length); + buf.writeBytes(temp); + } + @Override public int getAllPlayer() { return AllMusicVelocity.plugin.server.getPlayerCount(); @@ -195,9 +201,7 @@ public class SideVelocity extends ISide implements IEconomy { protected void topSendStop() { try { for (Player player : AllMusicVelocity.plugin.server.getAllPlayers()) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.STOP, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); @@ -211,9 +215,7 @@ public class SideVelocity extends ISide implements IEconomy { Optional player = AllMusicVelocity.plugin.server.getPlayer(name); if (!player.isPresent()) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.STOP.ordinal()); - send(player.get(), buf); + send(player.get(), PacketCodec.pack(ComType.STOP, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -221,17 +223,14 @@ public class SideVelocity extends ISide implements IEconomy { } @Override - public void sendMusic(String url) { + public void sendMusic(String data) { try { for (Player player : AllMusicVelocity.plugin.server.getAllPlayers()) { String server = player.getCurrentServer().isPresent() ? player.getCurrentServer().get().getServerInfo().getName() : null; if (AllMusic.isOK(player.getUsername(), server, false)) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.PLAY, data, 0)); AllMusic.addNowPlayPlayer(player.getUsername()); } } catch (Exception e) { @@ -241,7 +240,7 @@ public class SideVelocity extends ISide implements IEconomy { } @Override - protected void topSendMusic(String player, String url) { + protected void topSendMusic(String player, String data) { try { if (AllMusicVelocity.plugin.server.getPlayer(player).isPresent()) { Player player1 = AllMusicVelocity.plugin.server.getPlayer(player).get(); @@ -249,10 +248,7 @@ public class SideVelocity extends ISide implements IEconomy { player1.getCurrentServer().get().getServerInfo().getName() : null; if (AllMusic.isOK(player1.getUsername(), server, false)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.PLAY.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.PLAY, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲指令发送出错"); @@ -261,7 +257,7 @@ public class SideVelocity extends ISide implements IEconomy { } @Override - public void sendPic(String url) { + public void sendPic(String data) { try { for (Player player : AllMusicVelocity.plugin.server.getAllPlayers()) { if (ok(player)) @@ -270,10 +266,7 @@ public class SideVelocity extends ISide implements IEconomy { SaveObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player, buf); + send(player, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -282,16 +275,13 @@ public class SideVelocity extends ISide implements IEconomy { } @Override - public void sendPic(String player, String url) { + public void sendPic(String player, String data) { try { if (AllMusicVelocity.plugin.server.getPlayer(player).isPresent()) { Player player1 = AllMusicVelocity.plugin.server.getPlayer(player).get(); if (ok(player1)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.IMG.ordinal()); - writeString(buf, url); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.IMG, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c图片指令发送出错"); @@ -306,10 +296,7 @@ public class SideVelocity extends ISide implements IEconomy { Player player1 = AllMusicVelocity.plugin.server.getPlayer(player).get(); if (ok(player1)) return; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.POS.ordinal()); - buf.writeInt(pos); - send(player1, buf); + send(player1, PacketCodec.pack(ComType.POS, null, pos)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲位置指令发送出错"); @@ -326,10 +313,7 @@ public class SideVelocity extends ISide implements IEconomy { SaveObj obj = HudUtils.get(player.getUsername()); if (!obj.lyric.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LYRIC.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LYRIC, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发送出错"); @@ -346,10 +330,7 @@ public class SideVelocity extends ISide implements IEconomy { SaveObj obj = HudUtils.get(player.getUsername()); if (!obj.info.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.INFO.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.INFO, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词信息发送出错"); @@ -365,10 +346,7 @@ public class SideVelocity extends ISide implements IEconomy { return; SaveObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player.get(), buf); + send(player.get(), PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -388,21 +366,17 @@ public class SideVelocity extends ISide implements IEconomy { if (ok(player.get())) return; - ByteBuf buf = Unpooled.buffer(); switch (pos) { case INFO: - buf.writeByte(ComType.INFO.ordinal()); + send(player.get(), PacketCodec.pack(ComType.INFO, data, 0)); break; case LIST: - buf.writeByte(ComType.LIST.ordinal()); + send(player.get(), PacketCodec.pack(ComType.LIST, data, 0)); break; case LYRIC: - buf.writeByte(ComType.LYRIC.ordinal()); + send(player.get(), PacketCodec.pack(ComType.LYRIC, data, 0)); break; } - writeString(buf, data); - - send(player.get(), buf); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c停止指令发送出错"); e.printStackTrace(); @@ -419,10 +393,7 @@ public class SideVelocity extends ISide implements IEconomy { SaveObj obj = HudUtils.get(name); if (!obj.list.enable) continue; - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.LIST.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.LIST, data, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌曲列表发送出错"); @@ -436,10 +407,7 @@ public class SideVelocity extends ISide implements IEconomy { try { SaveObj obj = HudUtils.get(player.getUsername()); String data = AllMusic.gson.toJson(obj); - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.HUD.ordinal()); - writeString(buf, data); - send(player, buf); + send(player, PacketCodec.pack(ComType.HUD, data, 0)); } catch (Exception e1) { AllMusic.log.warning("§d[AllMusic]§c数据发送发生错误"); e1.printStackTrace(); @@ -468,10 +436,7 @@ public class SideVelocity extends ISide implements IEconomy { Optional player = AllMusicVelocity.plugin.server.getPlayer(name); if (!player.isPresent()) return; - - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player.get(), buf); + send(player.get(), PacketCodec.pack(ComType.CLEAR, null, 0)); } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c清空Hud发生出错"); e.printStackTrace(); @@ -483,9 +448,7 @@ public class SideVelocity extends ISide implements IEconomy { try { Collection values = AllMusicVelocity.plugin.server.getAllPlayers(); for (Player player : values) { - ByteBuf buf = Unpooled.buffer(); - buf.writeByte(ComType.CLEAR.ordinal()); - send(player, buf); + send(player, PacketCodec.pack(ComType.CLEAR, null, 0)); } } catch (Exception e) { AllMusic.log.warning("§d[AllMusic]§c歌词发生出错"); @@ -696,10 +659,4 @@ public class SideVelocity extends ISide implements IEconomy { return false; } - - private static void writeString(ByteBuf buf, String text) { - byte[] temp = text.getBytes(StandardCharsets.UTF_8); - buf.writeInt(temp.length); - buf.writeBytes(temp); - } }