[MAJOR] Implement new NOJANG modding system

This commit is contained in:
2024-05-01 13:26:18 +02:00
parent 76bc39ec33
commit bcbf91b39f
112 changed files with 1336 additions and 920 deletions

View File

@@ -1,12 +1,14 @@
package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.api.event.server.CraterRegisterCommandEvent;
import com.hypherionmc.craterlib.api.event.server.CraterServerLifecycleEvent;
import com.hypherionmc.craterlib.api.events.server.CraterRegisterCommandEvent;
import com.hypherionmc.craterlib.api.events.server.CraterServerLifecycleEvent;
import com.hypherionmc.craterlib.common.FabricCommonPlatform;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler;
import com.hypherionmc.craterlib.nojang.commands.CommandsRegistry;
import com.hypherionmc.craterlib.nojang.server.BridgedMinecraftServer;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
@@ -16,17 +18,19 @@ public class CraterLibInitializer implements ModInitializer {
@Override
public void onInitialize() {
new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.SERVER));
CommandRegistrationCallback.EVENT.register(
(dispatcher, registryAccess, environment) -> CraterEventBus.INSTANCE.postEvent(new CraterRegisterCommandEvent(dispatcher)));
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
CraterEventBus.INSTANCE.postEvent(new CraterRegisterCommandEvent());
CommandsRegistry.INSTANCE.registerCommands(dispatcher);
});
ServerLifecycleEvents.SERVER_STARTING.register(server -> {
FabricCommonPlatform.server = server;
CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Starting(server));
CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Starting(BridgedMinecraftServer.of(server)));
});
ServerLifecycleEvents.SERVER_STARTED.register(li -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Started()));
ServerLifecycleEvents.SERVER_STOPPING.register(server -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopping()));
ServerLifecycleEvents.SERVER_STOPPED.register(server -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopped()));
ServerLifecycleEvents.SERVER_STARTED.register(li -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Started(BridgedMinecraftServer.of(li))));
ServerLifecycleEvents.SERVER_STOPPING.register(server -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopping(BridgedMinecraftServer.of(server))));
ServerLifecycleEvents.SERVER_STOPPED.register(server -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopped(BridgedMinecraftServer.of(server))));
}
}

View File

@@ -1,10 +1,11 @@
package com.hypherionmc.craterlib.client;
import com.hypherionmc.craterlib.api.event.client.CraterClientTickEvent;
import com.hypherionmc.craterlib.api.events.client.CraterClientTickEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler;
import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedClientLevel;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
@@ -14,7 +15,7 @@ public class CraterLibClientInitializer implements ClientModInitializer {
public void onInitializeClient() {
new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.CLIENT));
ClientTickEvents.START_CLIENT_TICK.register((listener) -> {
CraterClientTickEvent event = new CraterClientTickEvent(listener.level);
CraterClientTickEvent event = new CraterClientTickEvent(BridgedClientLevel.of(listener.level));
CraterEventBus.INSTANCE.postEvent(event);
});

View File

@@ -1,6 +1,9 @@
package com.hypherionmc.craterlib.client;
import com.hypherionmc.craterlib.core.platform.ClientPlatform;
import com.hypherionmc.craterlib.nojang.client.BridgedMinecraft;
import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedClientLevel;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
import net.minecraft.client.Minecraft;
import net.minecraft.network.Connection;
import net.minecraft.world.entity.player.Player;
@@ -12,18 +15,18 @@ import net.minecraft.world.level.Level;
public class FabricClientPlatform implements ClientPlatform {
@Override
public Minecraft getClientInstance() {
return Minecraft.getInstance();
public BridgedMinecraft getClientInstance() {
return new BridgedMinecraft();
}
@Override
public Player getClientPlayer() {
return Minecraft.getInstance().player;
public BridgedPlayer getClientPlayer() {
return BridgedPlayer.of(Minecraft.getInstance().player);
}
@Override
public Level getClientLevel() {
return Minecraft.getInstance().level;
public BridgedClientLevel getClientLevel() {
return BridgedClientLevel.of(Minecraft.getInstance().level);
}
@Override

View File

@@ -1,8 +1,7 @@
package com.hypherionmc.craterlib.common;
import com.hypherionmc.craterlib.core.network.CraterNetworkHandler;
import com.hypherionmc.craterlib.core.platform.CommonPlatform;
import com.hypherionmc.craterlib.network.FabricNetworkHandler;
import com.hypherionmc.craterlib.nojang.server.BridgedMinecraftServer;
import net.minecraft.server.MinecraftServer;
/**
@@ -13,12 +12,7 @@ public class FabricCommonPlatform implements CommonPlatform {
public static MinecraftServer server;
@Override
public CraterNetworkHandler createPacketHandler(String modid, boolean requireClient, boolean requireServer) {
return FabricNetworkHandler.of(modid);
}
@Override
public MinecraftServer getMCServer() {
return server;
public BridgedMinecraftServer getMCServer() {
return BridgedMinecraftServer.of(server);
}
}

View File

@@ -0,0 +1,36 @@
package com.hypherionmc.craterlib.mixin;
import com.hypherionmc.craterlib.api.events.server.CraterServerChatEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
import com.hypherionmc.craterlib.utils.ChatUtils;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.PlayerChatMessage;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.FilteredText;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = ServerGamePacketListenerImpl.class, priority = Integer.MIN_VALUE)
public class ServerGamePacketListenerImplMixin {
@Shadow
public ServerPlayer player;
@Inject(
method = "lambda$handleChat$6",
at = @At("HEAD"),
cancellable = true
)
private void injectChatEvent(PlayerChatMessage arg, Component arg2, FilteredText arg3, CallbackInfo ci) {
CraterServerChatEvent event = new CraterServerChatEvent(BridgedPlayer.of(this.player), arg.decoratedContent().getString(), ChatUtils.mojangToAdventure(arg.decoratedContent()));
CraterEventBus.INSTANCE.postEvent(event);
if (event.wasCancelled())
ci.cancel();
}
}

View File

@@ -1,7 +1,9 @@
package com.hypherionmc.craterlib.mixin;
import com.hypherionmc.craterlib.api.event.client.LateInitEvent;
import com.hypherionmc.craterlib.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.nojang.client.BridgedMinecraft;
import com.hypherionmc.craterlib.nojang.client.BridgedOptions;
import net.minecraft.client.Minecraft;
import net.minecraft.client.Options;
import net.minecraft.client.tutorial.Tutorial;
@@ -15,7 +17,7 @@ public class TutorialMixin {
@Inject(method = "<init>", at = @At("RETURN"))
private void injectEarlyInitEvent(Minecraft minecraft, Options options, CallbackInfo ci) {
LateInitEvent event = new LateInitEvent(minecraft, options);
LateInitEvent event = new LateInitEvent(new BridgedMinecraft(), BridgedOptions.of(options));
CraterEventBus.INSTANCE.postEvent(event);
}

View File

@@ -5,6 +5,9 @@ import com.hypherionmc.craterlib.core.networking.PacketRegistry;
import com.hypherionmc.craterlib.core.networking.data.PacketContext;
import com.hypherionmc.craterlib.core.networking.data.PacketHolder;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.nojang.network.BridgedFriendlyByteBuf;
import com.hypherionmc.craterlib.nojang.resources.ResourceIdentifier;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
@@ -32,17 +35,17 @@ public class CraterFabricNetworkHandler extends PacketRegistry {
CHANNELS.put(holder.messageType(), new Message<>(holder.packetId(), holder.encoder()));
if (PacketSide.CLIENT.equals(this.side)) {
ClientPlayNetworking.registerGlobalReceiver(holder.packetId(), ((client, listener, buf, responseSender) -> {
ClientPlayNetworking.registerGlobalReceiver(holder.packetId().toMojang(), ((client, listener, buf, responseSender) -> {
buf.readByte();
T message = holder.decoder().apply(buf);
T message = holder.decoder().apply(BridgedFriendlyByteBuf.of(buf));
client.execute(() -> holder.handler().accept(new PacketContext<>(message, PacketSide.CLIENT)));
}));
} else {
ServerPlayNetworking.registerGlobalReceiver(holder.packetId(), ((server, player, listener, buf, responseSender) -> {
ServerPlayNetworking.registerGlobalReceiver(holder.packetId().toMojang(), ((server, player, listener, buf, responseSender) -> {
buf.readByte();
T message = holder.decoder().apply(buf);
server.execute(() -> holder.handler().accept(new PacketContext<>(player, message, PacketSide.SERVER)));
T message = holder.decoder().apply(BridgedFriendlyByteBuf.of(buf));
server.execute(() -> holder.handler().accept(new PacketContext<>(BridgedPlayer.of(player), message, PacketSide.SERVER)));
}));
}
@@ -58,24 +61,24 @@ public class CraterFabricNetworkHandler extends PacketRegistry {
public <T> void sendToServer(T packet, boolean ignoreCheck) {
Message<T> message = (Message<T>) CHANNELS.get(packet.getClass());
if (ClientPlayNetworking.canSend(message.id()) || ignoreCheck) {
if (ClientPlayNetworking.canSend(message.id().toMojang()) || ignoreCheck) {
FriendlyByteBuf buf = PacketByteBufs.create();
buf.writeByte(0);
message.encoder().accept(packet, buf);
ClientPlayNetworking.send(message.id(), buf);
message.encoder().accept(packet, BridgedFriendlyByteBuf.of(buf));
ClientPlayNetworking.send(message.id().toMojang(), buf);
}
}
public <T> void sendToClient(T packet, ServerPlayer player) {
public <T> void sendToClient(T packet, BridgedPlayer player) {
Message<T> message = (Message<T>) CHANNELS.get(packet.getClass());
if (ServerPlayNetworking.canSend(player, message.id()))
if (ServerPlayNetworking.canSend(player.toMojangServerPlayer(), message.id().toMojang()))
{
FriendlyByteBuf buf = PacketByteBufs.create();
buf.writeByte(0);
message.encoder().accept(packet, buf);
ServerPlayNetworking.send(player, message.id(), buf);
message.encoder().accept(packet, BridgedFriendlyByteBuf.of(buf));
ServerPlayNetworking.send(player.toMojangServerPlayer(), message.id().toMojang(), buf);
}
}
public record Message<T>(ResourceLocation id, BiConsumer<T, FriendlyByteBuf> encoder) { }
public record Message<T>(ResourceIdentifier id, BiConsumer<T, BridgedFriendlyByteBuf> encoder) { }
}

View File

@@ -9,6 +9,7 @@
"TutorialMixin"
],
"server": [
"ServerGamePacketListenerImplMixin"
],
"injectors": {
"defaultRequire": 1