Skip to content

Commit 80bc2c9

Browse files
committed
26.2 server
1 parent 1e3dc17 commit 80bc2c9

30 files changed

Lines changed: 1004 additions & 0 deletions
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
plugins {
2+
id("net.fabricmc.fabric-loom") version Versions.fabricLoom
3+
}
4+
5+
java.sourceCompatibility = JavaVersion.VERSION_25
6+
java.targetCompatibility = JavaVersion.VERSION_25
7+
8+
dependencies {
9+
minecraft("com.mojang:minecraft:26.2")
10+
implementation("net.fabricmc:fabric-loader:0.19.3")
11+
12+
implementation("net.fabricmc.fabric-api:fabric-api:0.152.1+26.2")
13+
14+
implementation(include("net.kyori:adventure-platform-fabric:7.0.0")!!)
15+
}
16+
17+
tasks {
18+
processResources {
19+
filesMatching("fabric.mod.json") {
20+
expand(
21+
"version" to project.version
22+
)
23+
}
24+
}
25+
26+
shadowJar {
27+
archiveFileName.set("[fabric-26.2]AllMusic_Server-${project.version}.jar")
28+
destinationDirectory.set(file("${parent!!.projectDir}/../build"))
29+
30+
// relocate("net.kyori", "com.coloryr.allmusic.libs.net.kyori")
31+
// relocate("com.google.gson", "com.coloryr.allmusic.libs.com.google.gson")
32+
}
33+
34+
build {
35+
dependsOn(shadowJar)
36+
}
37+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.coloryr.allmusic.comm;
2+
3+
import net.fabricmc.api.ModInitializer;
4+
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
5+
6+
public class AllMusicInit implements ModInitializer {
7+
@Override
8+
public void onInitialize() {
9+
PayloadTypeRegistry.clientboundPlay().register(MusicCodec.ID, MusicCodec.CODEC);
10+
}
11+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.coloryr.allmusic.comm;
2+
3+
import com.coloryr.allmusic.codec.MusicPack;
4+
import com.coloryr.allmusic.codec.MusicPacketCodec;
5+
import net.minecraft.network.FriendlyByteBuf;
6+
import net.minecraft.network.codec.StreamCodec;
7+
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
8+
import net.minecraft.resources.Identifier;
9+
import org.jspecify.annotations.NonNull;
10+
11+
public record MusicCodec(MusicPack pack) implements CustomPacketPayload {
12+
public static final Identifier ChannelID = Identifier.fromNamespaceAndPath("allmusic", "channel");
13+
14+
public static final Type<MusicCodec> ID = new Type<>(ChannelID);
15+
public static final StreamCodec<FriendlyByteBuf, MusicCodec> CODEC =
16+
StreamCodec.of((buf, value) -> MusicPacketCodec.pack(buf, value.pack),
17+
buf -> new MusicCodec(MusicPacketCodec.decode(buf)));
18+
19+
@Override
20+
public @NonNull Type<? extends CustomPacketPayload> type() {
21+
return ID;
22+
}
23+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.coloryr.allmusic.server;
2+
3+
import com.coloryr.allmusic.server.core.AllMusic;
4+
import net.fabricmc.api.DedicatedServerModInitializer;
5+
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
6+
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
7+
import net.minecraft.server.MinecraftServer;
8+
9+
import java.io.File;
10+
11+
public class AllMusicServer implements DedicatedServerModInitializer {
12+
public static MinecraftServer server;
13+
14+
@Override
15+
public void onInitializeServer() {
16+
AllMusic.log = new LogFabric();
17+
AllMusic.side = new SideFabric();
18+
19+
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment)
20+
-> CommandFabric.instance.register(dispatcher));
21+
22+
ServerLifecycleEvents.SERVER_STARTED.register((a) -> {
23+
server = a;
24+
AllMusic.init(new File(AllMusic.SERVER_DIR));
25+
AllMusic.start();
26+
Tasks.init();
27+
});
28+
29+
ServerLifecycleEvents.SERVER_STOPPING.register((a) -> {
30+
AllMusic.stop();
31+
});
32+
}
33+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.coloryr.allmusic.server;
2+
3+
import com.coloryr.allmusic.server.core.command.CommandEX;
4+
import com.mojang.brigadier.Command;
5+
import com.mojang.brigadier.CommandDispatcher;
6+
import com.mojang.brigadier.arguments.StringArgumentType;
7+
import com.mojang.brigadier.context.CommandContext;
8+
import com.mojang.brigadier.suggestion.SuggestionProvider;
9+
import com.mojang.brigadier.suggestion.Suggestions;
10+
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
11+
import net.minecraft.commands.CommandSourceStack;
12+
import net.minecraft.commands.Commands;
13+
14+
import java.util.List;
15+
import java.util.concurrent.CompletableFuture;
16+
import java.util.function.Predicate;
17+
18+
public class CommandFabric implements Command<CommandSourceStack>, Predicate<CommandSourceStack>, SuggestionProvider<CommandSourceStack> {
19+
public static CommandFabric instance = new CommandFabric();
20+
21+
public void register(CommandDispatcher<CommandSourceStack> dispatcher) {
22+
dispatcher.register(((Commands.literal("music").requires(this)).executes(this))
23+
.then(Commands.argument("args", StringArgumentType.greedyString())
24+
.suggests(this).executes(this)));
25+
}
26+
27+
@Override
28+
public int run(CommandContext<CommandSourceStack> context) {
29+
var item = context.getSource();
30+
31+
var input = context.getInput();
32+
var temp = input.split(" ");
33+
var arg = new String[temp.length - 1];
34+
System.arraycopy(temp, 1, arg, 0, arg.length);
35+
36+
CommandEX.execute(item, context.getSource().getTextName(), arg);
37+
38+
return 0;
39+
}
40+
41+
@Override
42+
public boolean test(CommandSourceStack stack) {
43+
return true;
44+
}
45+
46+
@Override
47+
public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder) {
48+
var item = context.getSource();
49+
50+
var input = context.getInput();
51+
var temp = input.split(" ");
52+
var arg = new String[input.endsWith(" ") ? temp.length : temp.length - 1];
53+
System.arraycopy(temp, 1, arg, 0, temp.length - 1);
54+
55+
builder = builder.createOffset(builder.getInput().lastIndexOf(32) + 1);
56+
57+
List<String> results = CommandEX.getTabList(item, item.getTextName(), arg);
58+
59+
String remaining = builder.getRemaining().trim();
60+
61+
for (String s : results) {
62+
if (s.startsWith(remaining)) {
63+
builder.suggest(s);
64+
}
65+
}
66+
67+
return builder.buildFuture();
68+
}
69+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.coloryr.allmusic.server;
2+
3+
import com.coloryr.allmusic.server.core.side.IAllMusicLogger;
4+
import net.kyori.adventure.text.Component;
5+
6+
7+
public class LogFabric implements IAllMusicLogger {
8+
@Override
9+
public void data(Component data) {
10+
AllMusicServer.server.sendMessage(data);
11+
}
12+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package com.coloryr.allmusic.server;
2+
3+
import com.coloryr.allmusic.codec.MusicPack;
4+
import com.coloryr.allmusic.comm.MusicCodec;
5+
import com.coloryr.allmusic.server.core.AllMusic;
6+
import com.coloryr.allmusic.server.core.objs.music.PlayerAddMusicObj;
7+
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
8+
import com.coloryr.allmusic.server.core.side.BaseSide;
9+
import com.coloryr.allmusic.server.event.MusicAddEvent;
10+
import com.coloryr.allmusic.server.event.MusicPlayEvent;
11+
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
12+
import net.minecraft.commands.CommandSourceStack;
13+
import net.minecraft.server.level.ServerPlayer;
14+
import net.minecraft.server.permissions.PermissionSet;
15+
import net.minecraft.world.InteractionResult;
16+
17+
import java.io.File;
18+
import java.util.Collection;
19+
20+
public class SideFabric extends BaseSide {
21+
@Override
22+
public void runTask(Runnable run) {
23+
AllMusicServer.server.execute(run);
24+
}
25+
26+
@Override
27+
public void runTask(Runnable run1, int delay) {
28+
Tasks.add(new TaskItem() {{
29+
tick = delay;
30+
run = run1;
31+
}});
32+
}
33+
34+
@Override
35+
public boolean checkPermission(Object player) {
36+
CommandSourceStack source = (CommandSourceStack) player;
37+
return source.permissions() == PermissionSet.ALL_PERMISSIONS;
38+
}
39+
40+
@Override
41+
public boolean isPlayer(Object player) {
42+
CommandSourceStack source = (CommandSourceStack) player;
43+
return source.isPlayer();
44+
}
45+
46+
@Override
47+
public boolean checkPermission(Object player, String permission) {
48+
return checkPermission(player);
49+
}
50+
51+
@Override
52+
public boolean needPlay(boolean islist) {
53+
for (var player : AllMusicServer.server.getPlayerList().getPlayers()) {
54+
if (!com.coloryr.allmusic.server.core.AllMusic.isSkip(player.getName().getString(), null, false, islist)) {
55+
return true;
56+
}
57+
}
58+
return false;
59+
}
60+
61+
@Override
62+
public Collection<?> getPlayers() {
63+
return AllMusicServer.server.getPlayerList().getPlayers();
64+
}
65+
66+
@Override
67+
public String getPlayerName(Object player) {
68+
if (player instanceof ServerPlayer player1) {
69+
return player1.getName().getString();
70+
}
71+
72+
return null;
73+
}
74+
75+
@Override
76+
public String getPlayerServer(Object player) {
77+
return null;
78+
}
79+
80+
@Override
81+
public void send(Object player, MusicPack pack) {
82+
if (player instanceof ServerPlayer player1) {
83+
send(player1, pack);
84+
}
85+
}
86+
87+
@Override
88+
public Object getPlayer(String player) {
89+
return AllMusicServer.server.getPlayerList().getPlayer(player);
90+
}
91+
92+
@Override
93+
public void sendBar(Object player, net.kyori.adventure.text.Component data) {
94+
if (player instanceof ServerPlayer player1) {
95+
player1.sendActionBar(data);
96+
}
97+
}
98+
99+
@Override
100+
public File getFolder() {
101+
return new File(AllMusic.SERVER_DIR);
102+
}
103+
104+
@Override
105+
public void broadcast(net.kyori.adventure.text.Component message) {
106+
for (var player : AllMusicServer.server.getPlayerList().getPlayers()) {
107+
if (!AllMusic.isSkip(player.getName().getString(), null, false)) {
108+
player.sendMessage(message);
109+
}
110+
}
111+
}
112+
113+
@Override
114+
public void sendMessage(Object obj, net.kyori.adventure.text.Component message) {
115+
if (obj instanceof CommandSourceStack source) {
116+
source.sendMessage(message);
117+
}
118+
}
119+
120+
@Override
121+
public boolean onMusicPlay(SongInfoObj obj) {
122+
return MusicPlayEvent.EVENT.invoker().interact(obj) != InteractionResult.PASS;
123+
}
124+
125+
@Override
126+
public boolean onMusicAdd(Object obj, PlayerAddMusicObj music) {
127+
CommandSourceStack source = (CommandSourceStack) obj;
128+
return MusicAddEvent.EVENT.invoker().interact(source.getPlayer(), music) != InteractionResult.PASS;
129+
}
130+
131+
private void send(ServerPlayer players, MusicPack data) {
132+
if (players == null)
133+
return;
134+
runTask(() -> ServerPlayNetworking.send(players, new MusicCodec(data)));
135+
}
136+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.coloryr.allmusic.server;
2+
3+
public class TaskItem {
4+
public int tick;
5+
public Runnable run;
6+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.coloryr.allmusic.server;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.concurrent.CopyOnWriteArrayList;
6+
7+
public class Tasks {
8+
private static final List<TaskItem> taskItems = new CopyOnWriteArrayList<>();
9+
10+
public static void init() {
11+
AllMusicServer.server.addTickable(Tasks::tick);
12+
}
13+
14+
public static void tick() {
15+
for (var item : new ArrayList<>(taskItems)) {
16+
item.tick--;
17+
if (item.tick <= 0) {
18+
taskItems.remove(item);
19+
item.run.run();
20+
}
21+
}
22+
}
23+
24+
public static void add(TaskItem item) {
25+
taskItems.add(item);
26+
}
27+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.coloryr.allmusic.server.event;
2+
3+
import com.coloryr.allmusic.server.core.objs.music.PlayerAddMusicObj;
4+
import net.fabricmc.fabric.api.event.Event;
5+
import net.fabricmc.fabric.api.event.EventFactory;
6+
import net.minecraft.server.level.ServerPlayer;
7+
import net.minecraft.world.InteractionResult;
8+
9+
public interface MusicAddEvent {
10+
Event<MusicAddEvent> EVENT = EventFactory.createArrayBacked(MusicAddEvent.class,
11+
(listeners) -> (player, music) -> {
12+
for (MusicAddEvent listener : listeners) {
13+
InteractionResult result = listener.interact(player, music);
14+
15+
if (result != InteractionResult.PASS) {
16+
return result;
17+
}
18+
}
19+
20+
return InteractionResult.PASS;
21+
});
22+
23+
InteractionResult interact(ServerPlayer player, PlayerAddMusicObj music);
24+
}

0 commit comments

Comments
 (0)