diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/CraterClientTickEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/CraterClientTickEvent.java new file mode 100644 index 0000000..0483218 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/CraterClientTickEvent.java @@ -0,0 +1,22 @@ +package com.hypherionmc.craterlib.api.event.client; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import net.minecraft.client.multiplayer.ClientLevel; + +public class CraterClientTickEvent extends CraterEvent { + + private final ClientLevel level; + + public CraterClientTickEvent(ClientLevel level) { + this.level = level; + } + + public ClientLevel getLevel() { + return level; + } + + @Override + public boolean canCancel() { + return false; + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/CraterSinglePlayerEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/CraterSinglePlayerEvent.java new file mode 100644 index 0000000..f439cd0 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/CraterSinglePlayerEvent.java @@ -0,0 +1,31 @@ +package com.hypherionmc.craterlib.api.event.client; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.mojang.realmsclient.dto.RealmsServer; +import net.minecraft.world.entity.player.Player; + +public class CraterSinglePlayerEvent extends CraterEvent { + + private final Player player; + + public CraterSinglePlayerEvent(Player player) { + this.player = player; + } + + public Player getPlayer() { + return player; + } + + @Override + public boolean canCancel() { + return false; + } + + public static class PlayerLogin extends CraterSinglePlayerEvent { + + public PlayerLogin(Player player) { + super(player); + } + + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/EarlyInitEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/EarlyInitEvent.java new file mode 100644 index 0000000..20d4cb8 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/EarlyInitEvent.java @@ -0,0 +1,29 @@ +package com.hypherionmc.craterlib.api.event.client; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; + +public class EarlyInitEvent extends CraterEvent { + + private final Minecraft minecraft; + private final Options options; + + public EarlyInitEvent(Minecraft minecraft, Options options) { + this.minecraft = minecraft; + this.options = options; + } + + public Minecraft getMinecraft() { + return minecraft; + } + + public Options getOptions() { + return options; + } + + @Override + public boolean canCancel() { + return false; + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/PlayerJoinRealmEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/PlayerJoinRealmEvent.java new file mode 100644 index 0000000..ff073b1 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/PlayerJoinRealmEvent.java @@ -0,0 +1,22 @@ +package com.hypherionmc.craterlib.api.event.client; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.mojang.realmsclient.dto.RealmsServer; + +public class PlayerJoinRealmEvent extends CraterEvent { + + private final RealmsServer server; + + public PlayerJoinRealmEvent(RealmsServer server) { + this.server = server; + } + + public RealmsServer getServer() { + return server; + } + + @Override + public boolean canCancel() { + return false; + } +} \ No newline at end of file diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/ScreenEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/ScreenEvent.java new file mode 100644 index 0000000..f11e83e --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/event/client/ScreenEvent.java @@ -0,0 +1,49 @@ +package com.hypherionmc.craterlib.api.event.client; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import net.minecraft.client.gui.screens.Screen; + +import java.util.Objects; + +public class ScreenEvent extends CraterEvent { + + private final Screen screen; + + protected ScreenEvent(Screen screen) { + this.screen = Objects.requireNonNull(screen); + } + + public Screen getScreen() { + return screen; + } + + @Override + public boolean canCancel() { + return false; + } + + public static class Opening extends ScreenEvent { + + private final Screen currentScreen; + private Screen newScreen; + + public Opening(Screen currentScreen, Screen newScreen) { + super(newScreen); + this.currentScreen = currentScreen; + this.newScreen = newScreen; + } + + public Screen getCurrentScreen() { + return currentScreen; + } + + public Screen getNewScreen() { + return newScreen; + } + + public void setNewScreen(Screen newScreen) { + this.newScreen = newScreen; + } + + } +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/event/server/CraterPlayerEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/event/server/CraterPlayerEvent.java index b77c311..3c99592 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/api/event/server/CraterPlayerEvent.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/event/server/CraterPlayerEvent.java @@ -1,17 +1,17 @@ package com.hypherionmc.craterlib.api.event.server; import com.hypherionmc.craterlib.core.event.CraterEvent; -import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; public class CraterPlayerEvent extends CraterEvent { - private final Player player; + private final ServerPlayer player; - public CraterPlayerEvent(Player player) { + public CraterPlayerEvent(ServerPlayer player) { this.player = player; } - public Player getPlayer() { + public ServerPlayer getPlayer() { return player; } @@ -22,7 +22,7 @@ public class CraterPlayerEvent extends CraterEvent { public static class PlayerLoggedIn extends CraterPlayerEvent { - public PlayerLoggedIn(Player player) { + public PlayerLoggedIn(ServerPlayer player) { super(player); } @@ -30,7 +30,7 @@ public class CraterPlayerEvent extends CraterEvent { public static class PlayerLoggedOut extends CraterPlayerEvent { - public PlayerLoggedOut(Player player) { + public PlayerLoggedOut(ServerPlayer player) { super(player); } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/platform/services/ILoaderHelper.java b/Common/src/main/java/com/hypherionmc/craterlib/core/platform/services/ILoaderHelper.java index 29362d4..1a66fea 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/platform/services/ILoaderHelper.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/platform/services/ILoaderHelper.java @@ -16,4 +16,5 @@ public interface ILoaderHelper { Environment getEnvironment(); boolean isModLoaded(String modid); boolean isDevEnv(); + int getModCount(); } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/CommandMixin.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/CommandMixin.java index 7342352..f8dce96 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/CommandMixin.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/CommandMixin.java @@ -18,7 +18,7 @@ public class CommandMixin { at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/CommandDispatcher;execute(Lcom/mojang/brigadier/ParseResults;)I", shift = At.Shift.BEFORE - ), cancellable = true + ), cancellable = true, remap = false ) private void injectCommandEvent(ParseResults stackParseResults, String command, CallbackInfoReturnable cir) { CraterCommandEvent commandEvent = new CraterCommandEvent(stackParseResults, command); diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/ClientLevelMixin.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/ClientLevelMixin.java new file mode 100644 index 0000000..0e9a461 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/ClientLevelMixin.java @@ -0,0 +1,21 @@ +package com.hypherionmc.craterlib.mixin.events.client; + +import com.hypherionmc.craterlib.api.event.client.CraterSinglePlayerEvent; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.AbstractClientPlayer; +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(ClientLevel.class) +public class ClientLevelMixin { + + @Inject(method = "addPlayer", at = @At("HEAD")) + private void injectSinglePlayerJoinEvent(int $$0, AbstractClientPlayer player, CallbackInfo ci) { + CraterSinglePlayerEvent.PlayerLogin playerLogin = new CraterSinglePlayerEvent.PlayerLogin(player); + CraterEventBus.INSTANCE.postEvent(playerLogin); + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/MinecraftMixin.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/MinecraftMixin.java new file mode 100644 index 0000000..f8de1d2 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/MinecraftMixin.java @@ -0,0 +1,29 @@ +package com.hypherionmc.craterlib.mixin.events.client; + +import com.hypherionmc.craterlib.api.event.client.ScreenEvent; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +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; + +import javax.annotation.Nullable; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow @Nullable public Screen screen; + + @Inject(method = "setScreen", at = @At(value = "TAIL")) + private void injectScreenOpeningEvent(Screen screen, CallbackInfo ci) { + Screen old = this.screen; + if (screen != null) { + ScreenEvent.Opening opening = new ScreenEvent.Opening(old, screen); + CraterEventBus.INSTANCE.postEvent(opening); + } + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/RealmsMainScreenMixin.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/RealmsMainScreenMixin.java new file mode 100644 index 0000000..ae814ef --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/RealmsMainScreenMixin.java @@ -0,0 +1,22 @@ +package com.hypherionmc.craterlib.mixin.events.client; + +import com.hypherionmc.craterlib.api.event.client.PlayerJoinRealmEvent; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.mojang.realmsclient.RealmsMainScreen; +import com.mojang.realmsclient.dto.RealmsServer; +import net.minecraft.client.gui.screens.Screen; +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(RealmsMainScreen.class) +public class RealmsMainScreenMixin { + + @Inject(at = @At("HEAD"), method = "play") + private void play(RealmsServer serverData, Screen parent, CallbackInfo ci) { + PlayerJoinRealmEvent playerJoinRealm = new PlayerJoinRealmEvent(serverData); + CraterEventBus.INSTANCE.postEvent(playerJoinRealm); + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/TutorialMixin.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/TutorialMixin.java new file mode 100644 index 0000000..260f836 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/client/TutorialMixin.java @@ -0,0 +1,22 @@ +package com.hypherionmc.craterlib.mixin.events.client; + +import com.hypherionmc.craterlib.api.event.client.EarlyInitEvent; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; +import net.minecraft.client.tutorial.Tutorial; +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(Tutorial.class) +public class TutorialMixin { + + @Inject(method = "", at = @At("RETURN")) + private void injectEarlyInitEvent(Minecraft minecraft, Options options, CallbackInfo ci) { + EarlyInitEvent event = new EarlyInitEvent(minecraft, options); + CraterEventBus.INSTANCE.postEvent(event); + } + +} diff --git a/Common/src/main/resources/craterlib.mixins.json b/Common/src/main/resources/craterlib.mixins.json index d676f0b..6b27b88 100644 --- a/Common/src/main/resources/craterlib.mixins.json +++ b/Common/src/main/resources/craterlib.mixins.json @@ -8,7 +8,11 @@ "client": [ "colors.BlockColorsMixin", "colors.ItemColorsMixin", - "events.PlayerMixin" + "events.PlayerMixin", + "events.client.ClientLevelMixin", + "events.client.MinecraftMixin", + "events.client.RealmsMainScreenMixin", + "events.client.TutorialMixin" ], "server": [ "events.CommandMixin", diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java b/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java index b4f4522..fbc7dd2 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java @@ -1,6 +1,9 @@ package com.hypherionmc.craterlib.client; +import com.hypherionmc.craterlib.api.event.client.CraterClientTickEvent; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; public class CraterLibClientInitializer implements ClientModInitializer { @@ -8,5 +11,10 @@ public class CraterLibClientInitializer implements ClientModInitializer { @Override public void onInitializeClient() { ItemGroupEvents.MODIFY_ENTRIES_ALL.register(FabricClientHelper::registerCreativeItems); + + ClientTickEvents.START_CLIENT_TICK.register((listener) -> { + CraterClientTickEvent event = new CraterClientTickEvent(listener.level); + CraterEventBus.INSTANCE.postEvent(event); + }); } } diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricLoaderHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricLoaderHelper.java index 44b0414..1362bca 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricLoaderHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricLoaderHelper.java @@ -61,4 +61,9 @@ public class FabricLoaderHelper implements ILoaderHelper { public boolean isDevEnv() { return FabricLoader.getInstance().isDevelopmentEnvironment(); } + + @Override + public int getModCount() { + return FabricLoader.getInstance().getAllMods().size(); + } }