diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/events/client/ScreenEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/events/client/ScreenEvent.java index 6d3ba24..034ca4a 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/api/events/client/ScreenEvent.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/events/client/ScreenEvent.java @@ -1,25 +1,24 @@ package com.hypherionmc.craterlib.api.events.client; import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.client.gui.BridgedScreen; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import net.minecraft.client.gui.screens.Screen; -// TODO NOJANG @Getter @RequiredArgsConstructor public class ScreenEvent extends CraterEvent { - private final Screen screen; + private final BridgedScreen screen; @Getter public static class Opening extends ScreenEvent { - private final Screen currentScreen; - @Setter private Screen newScreen; + private final BridgedScreen currentScreen; + @Setter private BridgedScreen newScreen; - public Opening(Screen currentScreen, Screen newScreen) { + public Opening(BridgedScreen currentScreen, BridgedScreen newScreen) { super(newScreen); this.currentScreen = currentScreen; this.newScreen = newScreen; 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 index 50a0f3b..2903131 100644 --- 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 @@ -2,6 +2,7 @@ package com.hypherionmc.craterlib.mixin.events.client; import com.hypherionmc.craterlib.api.events.client.ScreenEvent; import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.client.gui.BridgedScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; @@ -11,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -// TODO NOJANG @Mixin(Minecraft.class) public class MinecraftMixin { @@ -23,7 +23,7 @@ public class MinecraftMixin { private void injectScreenOpeningEvent(Screen screen, CallbackInfo ci) { Screen old = this.screen; if (screen != null) { - ScreenEvent.Opening opening = new ScreenEvent.Opening(old, screen); + ScreenEvent.Opening opening = new ScreenEvent.Opening(BridgedScreen.of(old), BridgedScreen.of(screen)); CraterEventBus.INSTANCE.postEvent(opening); } } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/BridgedMinecraft.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/BridgedMinecraft.java index 6078cad..89e5d05 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/BridgedMinecraft.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/BridgedMinecraft.java @@ -1,9 +1,84 @@ package com.hypherionmc.craterlib.nojang.client; +import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedClientLevel; +import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedServerData; +import com.hypherionmc.craterlib.nojang.client.server.BridgedIntegratedServer; +import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; +import lombok.Getter; +import net.minecraft.SharedConstants; import net.minecraft.client.Minecraft; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.UUID; public class BridgedMinecraft { + @Getter + private static final BridgedMinecraft instance = new BridgedMinecraft(); private final Minecraft internal = Minecraft.getInstance(); + public File getGameDirectory() { + return internal.gameDirectory; + } + + public BridgedOptions getOptions() { + return BridgedOptions.of(internal.options); + } + + @Nullable + public BridgedClientLevel getLevel() { + if (internal.level == null) + return null; + + return BridgedClientLevel.of(internal.level); + } + + public boolean isRealmServer() { + return internal.getCurrentServer() != null && internal.getCurrentServer().isRealm(); + } + + public boolean isSinglePlayer() { + return internal.hasSingleplayerServer(); + } + + @Nullable + public BridgedPlayer getPlayer() { + if (internal.player == null) + return null; + + return BridgedPlayer.of(internal.player); + } + + public String getGameVersion() { + return SharedConstants.getCurrentVersion().getName(); + } + + public String getUserName() { + return internal.getUser().getName(); + } + + public UUID getPlayerId() { + return internal.getUser().getProfileId(); + } + + @Nullable + public BridgedServerData getCurrentServer() { + if (internal.getCurrentServer() == null) + return null; + + return BridgedServerData.of(internal.getCurrentServer()); + } + + @Nullable + public BridgedIntegratedServer getSinglePlayerServer() { + return BridgedIntegratedServer.of(internal.getSingleplayerServer()); + } + + public int getServerPlayerCount () { + if (internal.getConnection() == null) + return 0; + + return internal.getConnection().getOnlinePlayers().size(); + } } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/gui/BridgedScreen.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/gui/BridgedScreen.java new file mode 100644 index 0000000..c4bcc23 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/gui/BridgedScreen.java @@ -0,0 +1,36 @@ +package com.hypherionmc.craterlib.nojang.client.gui; + +import lombok.RequiredArgsConstructor; +import net.minecraft.client.gui.screens.LevelLoadingScreen; +import net.minecraft.client.gui.screens.ReceivingLevelScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; +import net.minecraft.realms.RealmsScreen; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedScreen { + + private final Screen internal; + + public boolean isTitleScreen() { + return internal instanceof TitleScreen; + } + + public boolean isRealmsScreen() { + return internal instanceof RealmsScreen; + } + + public boolean isServerBrowserScreen() { + return internal instanceof JoinMultiplayerScreen; + } + + public boolean isLoadingScreen() { + return internal instanceof LevelLoadingScreen || internal instanceof ReceivingLevelScreen; + } + + public Screen toMojang() { + return internal; + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/multiplayer/BridgedClientLevel.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/multiplayer/BridgedClientLevel.java index 23d5431..4e7b60b 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/multiplayer/BridgedClientLevel.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/multiplayer/BridgedClientLevel.java @@ -1,11 +1,59 @@ package com.hypherionmc.craterlib.nojang.client.multiplayer; +import com.hypherionmc.craterlib.nojang.core.BridgedBlockPos; +import com.hypherionmc.craterlib.nojang.resources.ResourceIdentifier; +import com.hypherionmc.craterlib.utils.ChatUtils; import lombok.RequiredArgsConstructor; +import net.kyori.adventure.text.Component; import net.minecraft.client.multiplayer.ClientLevel; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.atomic.AtomicReference; @RequiredArgsConstructor(staticName = "of") public class BridgedClientLevel { private final ClientLevel internal; + public boolean isClientSide() { + return internal.isClientSide(); + } + + public long getGameTime() { + return internal.getGameTime(); + } + + public long getDayTime() { + return internal.getDayTime(); + } + + public long dayTime() { + return internal.dayTime(); + } + + public boolean isRaining() { + return internal.isRaining(); + } + + public boolean isThundering() { + return internal.isThundering(); + } + + @Nullable + public ResourceIdentifier getDimensionKey() { + return ResourceIdentifier.fromMojang(internal.dimension().location()); + } + + @Nullable + public ResourceIdentifier getBiomeIdentifier(BridgedBlockPos onPos) { + AtomicReference identifier = new AtomicReference<>(null); + internal.getBiome(onPos.toMojang()).unwrap().ifLeft(b -> identifier.set(ResourceIdentifier.fromMojang(b.location()))); + return identifier.get(); + } + + @Nullable + public Component getDifficulty() { + return ChatUtils.mojangToAdventure(internal.getDifficulty().getDisplayName()); + } + } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/multiplayer/BridgedServerData.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/multiplayer/BridgedServerData.java new file mode 100644 index 0000000..c594872 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/multiplayer/BridgedServerData.java @@ -0,0 +1,40 @@ +package com.hypherionmc.craterlib.nojang.client.multiplayer; + +import com.hypherionmc.craterlib.utils.ChatUtils; +import lombok.RequiredArgsConstructor; +import net.kyori.adventure.text.Component; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.ServerStatusPinger; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedServerData { + + private final ServerData internal; + + public String name() { + return internal.name; + } + + public String ip() { + return internal.ip; + } + + public Component motd() { + return ChatUtils.mojangToAdventure(internal.motd); + } + + public int getMaxPlayers() { + if (!internal.pinged || internal.players == null) { + try { + new ServerStatusPinger().pingServer(internal, () -> {}); + } catch (Exception ignored) {} + } + + return internal.players == null ? 0 : internal.players.max(); + } + + public ServerData toMojang() { + return internal; + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/server/BridgedIntegratedServer.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/server/BridgedIntegratedServer.java new file mode 100644 index 0000000..0ecacaf --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/client/server/BridgedIntegratedServer.java @@ -0,0 +1,19 @@ +package com.hypherionmc.craterlib.nojang.client.server; + +import lombok.RequiredArgsConstructor; +import net.minecraft.client.server.IntegratedServer; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedIntegratedServer { + + private final IntegratedServer internal; + + public String getLevelName() { + return internal.getWorldData().getLevelName(); + } + + public IntegratedServer toMojang() { + return internal; + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/core/BridgedBlockPos.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/core/BridgedBlockPos.java new file mode 100644 index 0000000..bd49e2c --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/core/BridgedBlockPos.java @@ -0,0 +1,27 @@ +package com.hypherionmc.craterlib.nojang.core; + +import lombok.RequiredArgsConstructor; +import net.minecraft.core.BlockPos; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedBlockPos { + + private final BlockPos internal; + + public int getX() { + return internal.getX(); + } + + public int getY() { + return internal.getY(); + } + + public int getZ() { + return internal.getZ(); + } + + public BlockPos toMojang() { + return internal; + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/network/BridgedFriendlyByteBuf.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/network/BridgedFriendlyByteBuf.java index 3dd55ed..a7bafd0 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/nojang/network/BridgedFriendlyByteBuf.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/network/BridgedFriendlyByteBuf.java @@ -18,6 +18,15 @@ public class BridgedFriendlyByteBuf { return BridgedFriendlyByteBuf.of(internal); } + public BridgedFriendlyByteBuf writeUtf(String value) { + internal.writeUtf(value); + return BridgedFriendlyByteBuf.of(internal); + } + + public String readUtf() { + return internal.readUtf(); + } + public FriendlyByteBuf toMojang() { return internal; } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/realmsclient/dto/BridgedRealmsServer.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/realmsclient/dto/BridgedRealmsServer.java index f377af8..dddf746 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/nojang/realmsclient/dto/BridgedRealmsServer.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/realmsclient/dto/BridgedRealmsServer.java @@ -1,5 +1,6 @@ package com.hypherionmc.craterlib.nojang.realmsclient.dto; +import com.mojang.realmsclient.dto.PlayerInfo; import com.mojang.realmsclient.dto.RealmsServer; import lombok.RequiredArgsConstructor; @@ -8,4 +9,32 @@ public class BridgedRealmsServer { private final RealmsServer internal; + public String getName() { + return internal.getName(); + } + + public String getDescription() { + return internal.getDescription(); + } + + public String getWorldType() { + return internal.worldType.name(); + } + + public String getMinigameName() { + return internal.getMinigameName(); + } + + public String getMinigameImage() { + return internal.minigameImage; + } + + public long getPlayerCount() { + return internal.players.stream().filter(PlayerInfo::getOnline).count(); + } + + public RealmsServer toMojang() { + return internal; + } + } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/resources/ResourceIdentifier.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/resources/ResourceIdentifier.java index 2ca1dd5..9b848f4 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/nojang/resources/ResourceIdentifier.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/resources/ResourceIdentifier.java @@ -26,6 +26,10 @@ public class ResourceIdentifier { return internal.toString(); } + public static ResourceIdentifier fromMojang(ResourceLocation location) { + return new ResourceIdentifier(location.getNamespace(), location.getPath()); + } + public ResourceLocation toMojang() { return internal; } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/nojang/world/entity/player/BridgedPlayer.java b/Common/src/main/java/com/hypherionmc/craterlib/nojang/world/entity/player/BridgedPlayer.java index b4da5cc..8aa6d49 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/nojang/world/entity/player/BridgedPlayer.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/nojang/world/entity/player/BridgedPlayer.java @@ -1,6 +1,7 @@ package com.hypherionmc.craterlib.nojang.world.entity.player; import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.hypherionmc.craterlib.nojang.core.BridgedBlockPos; import com.hypherionmc.craterlib.utils.ChatUtils; import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.Component; @@ -44,6 +45,10 @@ public class BridgedPlayer { return internal; } + public BridgedBlockPos getOnPos() { + return BridgedBlockPos.of(internal.getOnPos()); + } + @Nullable public ServerGamePacketListenerImpl getConnection() { if (isServerPlayer()) { diff --git a/Common/src/main/java/com/hypherionmc/craterlib/utils/ChatUtils.java b/Common/src/main/java/com/hypherionmc/craterlib/utils/ChatUtils.java index 96943b6..0c557ff 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/utils/ChatUtils.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/utils/ChatUtils.java @@ -1,10 +1,12 @@ package com.hypherionmc.craterlib.utils; +import com.hypherionmc.craterlib.nojang.resources.ResourceIdentifier; import me.hypherionmc.mcdiscordformatter.discord.DiscordSerializer; import me.hypherionmc.mcdiscordformatter.minecraft.MinecraftSerializer; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -77,4 +79,11 @@ public class ChatUtils { public static net.kyori.adventure.text.Component makeComponent(String text) { return net.kyori.adventure.text.Component.translatable(text); } + + public static net.kyori.adventure.text.Component getBiomeName(ResourceIdentifier identifier) { + if (identifier == null) + return net.kyori.adventure.text.Component.text("Unknown"); + + return mojangToAdventure(Component.translatable(Util.makeDescriptionId("biome", identifier.toMojang()))); + } } 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 4367a54..b5ec5b1 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/client/CraterLibClientInitializer.java @@ -15,6 +15,9 @@ public class CraterLibClientInitializer implements ClientModInitializer { public void onInitializeClient() { new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.CLIENT)); ClientTickEvents.START_CLIENT_TICK.register((listener) -> { + if (listener.level == null) + return; + CraterClientTickEvent event = new CraterClientTickEvent(BridgedClientLevel.of(listener.level)); CraterEventBus.INSTANCE.postEvent(event); }); diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/client/ForgeClientEvents.java b/Forge/src/main/java/com/hypherionmc/craterlib/client/ForgeClientEvents.java index 1532c31..2b9d5cc 100644 --- a/Forge/src/main/java/com/hypherionmc/craterlib/client/ForgeClientEvents.java +++ b/Forge/src/main/java/com/hypherionmc/craterlib/client/ForgeClientEvents.java @@ -15,6 +15,9 @@ public class ForgeClientEvents { @SubscribeEvent public static void clientTick(TickEvent.LevelTickEvent event) { + if (event.level == null) + return; + CraterClientTickEvent craterClientTickEvent = new CraterClientTickEvent(BridgedClientLevel.of(Minecraft.getInstance().level)); CraterEventBus.INSTANCE.postEvent(craterClientTickEvent); } diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java index a11b60e..69cd537 100644 --- a/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java @@ -15,6 +15,9 @@ public class NeoForgeClientEvents { @SubscribeEvent public static void clientTick(TickEvent.LevelTickEvent event) { + if (event.level == null) + return; + CraterClientTickEvent craterClientTickEvent = new CraterClientTickEvent(BridgedClientLevel.of(Minecraft.getInstance().level)); CraterEventBus.INSTANCE.postEvent(craterClientTickEvent); } diff --git a/build.gradle b/build.gradle index 254925f..d068e7d 100644 --- a/build.gradle +++ b/build.gradle @@ -31,6 +31,8 @@ subprojects { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 + group = rootProject.group + repositories { mavenCentral()