Implement events and helpers needed by Simple RPC

This commit is contained in:
2023-05-29 18:26:20 +02:00
parent bb49e8052b
commit 5a1492a25a
15 changed files with 273 additions and 8 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}

View File

@@ -16,4 +16,5 @@ public interface ILoaderHelper {
Environment getEnvironment();
boolean isModLoaded(String modid);
boolean isDevEnv();
int getModCount();
}

View File

@@ -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<CommandSourceStack> stackParseResults, String command, CallbackInfoReturnable<Integer> cir) {
CraterCommandEvent commandEvent = new CraterCommandEvent(stackParseResults, command);

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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 = "<init>", at = @At("RETURN"))
private void injectEarlyInitEvent(Minecraft minecraft, Options options, CallbackInfo ci) {
EarlyInitEvent event = new EarlyInitEvent(minecraft, options);
CraterEventBus.INSTANCE.postEvent(event);
}
}