From 643ed852eb6ea7fde1f1dbe53d3b8627d9d0d1d0 Mon Sep 17 00:00:00 2001 From: "Craig (Jeryn)" Date: Sun, 15 Dec 2024 13:11:41 +0000 Subject: [PATCH] Monitor Overhaul (#410) Co-authored-by: Edrax Doodles Co-authored-by: River Thomas van der Meulen --- LICENSE.MD | 4 +- changelog.md | 21 +- .../tardis_refined/client/ScreenHandler.java | 38 +- .../client/overlays/ExteriorViewOverlay.java | 55 ++- .../client/overlays/VortexOverlay.java | 8 +- .../console/GlobalConsoleRenderer.java | 8 +- .../renderer/vortex/RenderTargetHelper.java | 2 +- .../client/renderer/vortex/ShellRenderer.java | 10 +- .../renderer/vortex/VortexRenderer.java | 43 +- .../client/screen/MonitorScreen.java | 124 ------ .../GenericMonitorSelectionList.java | 2 +- .../client/screen/main/MonitorOS.java | 367 ++++++++++++++++++ .../client/screen/main/MonitorScreen.java | 180 +++++++++ .../screen/ponder/PonderListScreen.java | 50 +++ .../client/screen/ponder/PonderScreen.java | 177 +++++++++ .../{ => screens}/CancelDesktopScreen.java | 44 +-- .../DesktopSelectionScreen.java | 103 ++--- .../HumSelectionScreen.java | 93 ++--- .../screen/screens/ShellSelectionScreen.java | 141 +++++++ .../screen/screens/VortexSelectionScreen.java | 115 ++++++ .../WaypointListScreen.java | 94 ++--- .../WaypointManageScreen.java | 87 ++--- .../screen/selections/SelectionScreen.java | 101 ----- .../selections/ShellSelectionScreen.java | 268 ------------- .../selections/VortexSelectionScreen.java | 202 ---------- .../block/device/AstralManipulatorBlock.java | 39 +- .../shell/RootedShellBlockEntity.java | 9 + .../capability/player/TardisPlayerInfo.java | 2 + .../ManipulatorRecipes.java | 3 + .../common/entity/ControlEntity.java | 3 +- .../common/network/TardisNetwork.java | 4 +- .../network/messages/C2SChangeShell.java | 8 +- .../player/EndPlayerVortexSessionMessage.java | 36 -- .../player/StartVortexSessionMessage.java | 44 --- .../screens/S2COpenCraftingScreen.java | 34 ++ .../messages/screens/S2COpenMonitor.java | 20 +- .../screens/S2COpenShellSelection.java | 2 +- .../common/tardis/TardisWaypoint.java | 5 + .../control/flight/CoordinateControl.java | 3 +- .../control/flight/FastReturnControl.java | 3 +- .../control/flight/FuelToggleControl.java | 3 +- .../tardis/control/flight/GenericControl.java | 3 +- .../control/flight/HandbrakeControl.java | 3 +- .../control/flight/IncrementControl.java | 3 +- .../tardis/control/flight/RandomControl.java | 3 +- .../tardis/control/flight/ReadoutControl.java | 3 +- .../control/flight/RotationControl.java | 3 +- .../tardis/control/ship/MonitorControl.java | 3 +- .../tardis_refined/constants/ModMessages.java | 3 +- .../mixin/render/buffer/MixinMainTarget.java | 69 +++- .../registry/TRBlockRegistry.java | 4 +- .../registry/TRPointOfInterestTypes.java | 8 +- .../registry/TRVillagerProfession.java | 4 +- .../tardis_refined/textures/gui/desktop.png | Bin 9193 -> 0 bytes .../textures/gui/desktop_overlay.png | Bin 9945 -> 0 bytes .../textures/gui/external_view.png | Bin 2127 -> 0 bytes .../textures/gui/gallifreyan_symbols.png | Bin 38316 -> 0 bytes .../tardis_refined/textures/gui/gui_black.png | Bin 141 -> 0 bytes .../tardis_refined/textures/gui/monitor.png | Bin 2114 -> 0 bytes .../textures/gui/monitor/backdrop.png | Bin 0 -> 3141 bytes .../textures/gui/monitor/frame_brass.png | Bin 0 -> 1954 bytes .../gui/monitor/gallifreyan_symbols.png | Bin 0 -> 5792 bytes .../textures/gui/{ => monitor}/noise.png | Bin .../common/data/ItemModelProvider.java | 2 +- .../common/data/LangProviderEnglish.java | 10 +- .../common/data/TRBlockModelProvider.java | 2 +- .../common/data/TRPoiTypeTagsProvider.java | 2 +- 67 files changed, 1465 insertions(+), 1215 deletions(-) delete mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/MonitorScreen.java create mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorOS.java create mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorScreen.java create mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderListScreen.java create mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderScreen.java rename common/src/main/java/whocraft/tardis_refined/client/screen/{ => screens}/CancelDesktopScreen.java (59%) rename common/src/main/java/whocraft/tardis_refined/client/screen/{selections => screens}/DesktopSelectionScreen.java (56%) rename common/src/main/java/whocraft/tardis_refined/client/screen/{selections => screens}/HumSelectionScreen.java (52%) create mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/screens/ShellSelectionScreen.java create mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/screens/VortexSelectionScreen.java rename common/src/main/java/whocraft/tardis_refined/client/screen/{waypoints => screens}/WaypointListScreen.java (65%) rename common/src/main/java/whocraft/tardis_refined/client/screen/{waypoints => screens}/WaypointManageScreen.java (70%) delete mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/selections/SelectionScreen.java delete mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/selections/ShellSelectionScreen.java delete mode 100644 common/src/main/java/whocraft/tardis_refined/client/screen/selections/VortexSelectionScreen.java delete mode 100644 common/src/main/java/whocraft/tardis_refined/common/network/messages/player/EndPlayerVortexSessionMessage.java delete mode 100644 common/src/main/java/whocraft/tardis_refined/common/network/messages/player/StartVortexSessionMessage.java create mode 100644 common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenCraftingScreen.java delete mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/desktop.png delete mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/desktop_overlay.png delete mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/external_view.png delete mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/gallifreyan_symbols.png delete mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/gui_black.png delete mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/monitor.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/monitor/backdrop.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/monitor/frame_brass.png create mode 100644 common/src/main/resources/assets/tardis_refined/textures/gui/monitor/gallifreyan_symbols.png rename common/src/main/resources/assets/tardis_refined/textures/gui/{ => monitor}/noise.png (100%) diff --git a/LICENSE.MD b/LICENSE.MD index 3f09b052c..aed8dcb63 100644 --- a/LICENSE.MD +++ b/LICENSE.MD @@ -149,8 +149,8 @@ or other kind of organization that you work for, plus all its affiliates. **Affiliates** means the other organizations than an -organization has control over, is under the control of, or is -under common control with. +organization has controlEntity over, is under the controlEntity of, or is +under common controlEntity with. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies diff --git a/changelog.md b/changelog.md index cd6018eb4..01cf4caf0 100644 --- a/changelog.md +++ b/changelog.md @@ -3,16 +3,17 @@ ![TARDIS Refined](https://wiki.tardisrefined.net/TARDIS-Refined-Wiki/tardis_refined_v2.png) #### Bug Fixes -- Bug Fix: Added "Compatibility" with [Diagonal Windows](https://www.curseforge.com/minecraft/mc-mods/diagonal-windows) -- Bug Fix: Exception Ticking World [#388](https://github.com/WhoCraft/TardisRefined/issues/388) -- Bug Fix: Nuka Console Duplicate Control Entity Failing Flight Dance Events [#376](https://github.com/WhoCraft/TardisRefined/issues/376) -- Bug Fix: land pad dont work and crash on server [#377](https://github.com/WhoCraft/TardisRefined/issues/377) -- Bug Fix: tardis is damaged [#351](https://github.com/WhoCraft/TardisRefined/issues/351) -- Bug Fix: Diagonal Windows makes it impossible to craft the terraformer [#383](https://github.com/WhoCraft/TardisRefined/issues/383) -- Bug Fix: relogging causes TARDIS Dance events to not occur [#387](https://github.com/WhoCraft/TardisRefined/issues/387) -- Bug Fix: [Incompatibility] Tardis refined dimensions fail to load with Dimension Threads [#374](https://github.com/WhoCraft/TardisRefined/issues/374) -- Bug Fix: Console cannot be removed/changed with the console configurator outside the TARDIS dimension [#380](https://github.com/WhoCraft/TardisRefined/issues/380) -- Bug Fix: Fixed a bug where the overlay keybinds always rendered the default key +- Bug fix: Added "Compatibility" with [Diagonal Windows](https://www.curseforge.com/minecraft/mc-mods/diagonal-windows) +- Bug fix: Exception Ticking World [#388](https://github.com/WhoCraft/TardisRefined/issues/388) +- Bug fix: Nuka Console Duplicate Control Entity Failing Flight Dance Events [#376](https://github.com/WhoCraft/TardisRefined/issues/376) +- Bug fix: land pad dont work and crash on server [#377](https://github.com/WhoCraft/TardisRefined/issues/377) +- Bug fix: tardis is damaged [#351](https://github.com/WhoCraft/TardisRefined/issues/351) +- Bug fix: Diagonal Windows makes it impossible to craft the terraformer [#383](https://github.com/WhoCraft/TardisRefined/issues/383) +- Bug fix: relogging causes TARDIS Dance events to not occur [#387](https://github.com/WhoCraft/TardisRefined/issues/387) +- Bug fix: [Incompatibility] Tardis refined dimensions fail to load with Dimension Threads [#374](https://github.com/WhoCraft/TardisRefined/issues/374) +- Bug fix: Console cannot be removed/changed with the console configurator outside the TARDIS dimension [#380](https://github.com/WhoCraft/TardisRefined/issues/380) +- Bug fix: Fixed a bug where the overlay keybinds always rendered the default key +- Bug fix: Fixed a bug where a new TARDIS would believe it was at 0,0,0 #### Enhancements - Enhancement: Added Adventure Mode diff --git a/common/src/main/java/whocraft/tardis_refined/client/ScreenHandler.java b/common/src/main/java/whocraft/tardis_refined/client/ScreenHandler.java index 8eceb4dd4..2e0e872ae 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/ScreenHandler.java +++ b/common/src/main/java/whocraft/tardis_refined/client/ScreenHandler.java @@ -7,13 +7,15 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; -import whocraft.tardis_refined.client.screen.CancelDesktopScreen; -import whocraft.tardis_refined.client.screen.MonitorScreen; -import whocraft.tardis_refined.client.screen.selections.ShellSelectionScreen; +import whocraft.tardis_refined.client.screen.ponder.PonderListScreen; +import whocraft.tardis_refined.client.screen.screens.CancelDesktopScreen; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.client.screen.main.MonitorScreen; +import whocraft.tardis_refined.client.screen.screens.ShellSelectionScreen; import whocraft.tardis_refined.client.screen.upgrades.UpgradesScreen; import whocraft.tardis_refined.client.screen.waypoints.CoordInputType; -import whocraft.tardis_refined.client.screen.waypoints.WaypointListScreen; -import whocraft.tardis_refined.client.screen.waypoints.WaypointManageScreen; +import whocraft.tardis_refined.client.screen.screens.WaypointListScreen; +import whocraft.tardis_refined.client.screen.screens.WaypointManageScreen; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.capability.tardis.upgrades.UpgradeHandler; import whocraft.tardis_refined.common.tardis.TardisNavLocation; @@ -28,11 +30,21 @@ public class ScreenHandler { @Environment(EnvType.CLIENT) public static void setWaypointScreen(Collection waypoints) { + Minecraft mc = Minecraft.getInstance(); + if (mc.screen instanceof MonitorOS) { + ((MonitorOS) mc.screen).switchScreenToRight(new WaypointListScreen(waypoints)); + return; + } Minecraft.getInstance().setScreen(new WaypointListScreen(waypoints)); } @Environment(EnvType.CLIENT) public static void setCoordinatesScreen(List> levels, CoordInputType coordInputType, TardisNavLocation tardisNavLocation) { + Minecraft mc = Minecraft.getInstance(); + if (mc.screen instanceof MonitorOS) { + ((MonitorOS) mc.screen).switchScreenToRight(new WaypointManageScreen(levels, coordInputType, tardisNavLocation)); + return; + } Minecraft.getInstance().setScreen(new WaypointManageScreen(levels, coordInputType, tardisNavLocation)); } @@ -42,13 +54,14 @@ public static void setEditCoordinatesScreen(TardisWaypoint waypoint) { } @Environment(EnvType.CLIENT) - public static void openMonitorScreen(boolean desktopGenerating, CompoundTag upgradeHandlerNbt, TardisNavLocation currentLocation, TardisNavLocation targetLocation) { + public static void openMonitorScreen(boolean desktopGenerating, CompoundTag upgradeHandlerNbt, TardisNavLocation currentLocation, TardisNavLocation targetLocation, ResourceLocation currentShellTheme) { if (desktopGenerating) { Minecraft.getInstance().setScreen(new CancelDesktopScreen()); } else { + assert Minecraft.getInstance().level != null; UpgradeHandler upgradeHandlerClient = new UpgradeHandler(new TardisLevelOperator(Minecraft.getInstance().level)); upgradeHandlerClient.loadData(upgradeHandlerNbt); - Minecraft.getInstance().setScreen(new MonitorScreen(currentLocation, targetLocation, upgradeHandlerClient)); + Minecraft.getInstance().setScreen(new MonitorScreen(currentLocation, targetLocation, upgradeHandlerClient, currentShellTheme)); } } @@ -64,6 +77,7 @@ public static void openEditCoordinatesScreen(TardisWaypoint waypoint) { @Environment(EnvType.CLIENT) public static void displayUpgradesScreen(CompoundTag upgradeTag) { + assert Minecraft.getInstance().level != null; UpgradeHandler upgradeHandlerClient = new UpgradeHandler(new TardisLevelOperator(Minecraft.getInstance().level)); upgradeHandlerClient.loadData(upgradeTag); @@ -76,6 +90,16 @@ public static void displayUpgradesScreen(CompoundTag upgradeTag) { @Environment(EnvType.CLIENT) public static void openShellSelection(ResourceLocation currentShell) { + Minecraft mc = Minecraft.getInstance(); + if (mc.screen instanceof MonitorOS) { + ((MonitorOS) mc.screen).switchScreenToRight(new ShellSelectionScreen(currentShell)); + return; + } Minecraft.getInstance().setScreen(new ShellSelectionScreen(currentShell)); } + + @Environment(EnvType.CLIENT) + public static void openCraftingScreen() { + Minecraft.getInstance().setScreen(new PonderListScreen()); + } } diff --git a/common/src/main/java/whocraft/tardis_refined/client/overlays/ExteriorViewOverlay.java b/common/src/main/java/whocraft/tardis_refined/client/overlays/ExteriorViewOverlay.java index aabd0c62f..611903db1 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/overlays/ExteriorViewOverlay.java +++ b/common/src/main/java/whocraft/tardis_refined/client/overlays/ExteriorViewOverlay.java @@ -6,11 +6,12 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.client.TRKeybinds; import whocraft.tardis_refined.client.TardisClientData; @@ -19,10 +20,6 @@ import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.constants.ModMessages; -import java.util.ArrayList; -import java.util.Collection; -import java.util.UUID; - public class ExteriorViewOverlay { public static final ResourceLocation BAR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/bar/journey_bar.png"); @@ -35,23 +32,21 @@ public static void renderOverlay(GuiGraphics guiGraphics) { Minecraft mc = Minecraft.getInstance(); if (!shouldRender) return; + TardisPlayerInfo.get(mc.player).ifPresent(tardisPlayerInfo -> { // Exit if the player is not viewing the TARDIS or the debug screen is active if (!tardisPlayerInfo.isViewingTardis()) return; - TardisClientData tardisClientData = TardisClientData.getInstance(tardisPlayerInfo.getPlayerPreviousPos().getDimensionKey()); + TardisClientData tardisClientData = TardisClientData.getInstance(tardisPlayerInfo.getPlayerPreviousPos().getDimensionKey()); PoseStack poseStack = guiGraphics.pose(); int screenWidth = mc.getWindow().getGuiScaledWidth(); int screenHeight = mc.getWindow().getGuiScaledHeight(); + // Background for keybind text int x = 10; // X position for text int y = 10; // Initial Y position for text - // Background for text - int textBackdropWidth = 150; // Width of the backdrop box - int textBackdropHeight = 70; // Total height for the text backdrop box - int remainingFuel = (int) tardisClientData.getFuel(); int maxFuel = (int) tardisClientData.getMaximumFuel(); int fuelPercentage = maxFuel != 0 ? (int) ((double) remainingFuel / maxFuel * 100) : 0; @@ -68,39 +63,69 @@ public static void renderOverlay(GuiGraphics guiGraphics) { // Display fuel percentage MutableComponent fuelMessage = Component.translatable(ModMessages.FUEL, fuelPercentage).append("%").withStyle(ChatFormatting.WHITE); - int messageWidth = mc.font.width(message); + // Get player coordinates + BlockPos pos = mc.player.blockPosition(); + BlockPos targetPos = pos.east(120); + + Vec3 currentPos = new Vec3(pos.getX(), pos.getY(), pos.getZ()); + + double progress = tardisClientData.getJourneyProgress(); + int xV = (int) (currentPos.x + ((targetPos.getX() - currentPos.x) * progress)); + int yV = (int) (currentPos.y + ((targetPos.getY() - currentPos.y) * progress)); + int zV = (int) (currentPos.z + ((targetPos.getZ() - currentPos.z) * progress)); + + BlockPos landingLocation = new BlockPos(xV, yV, zV); + + MutableComponent coordsMessage = Component.literal( + String.format("Coordinates: X: %d Y: %d Z: %d", landingLocation.getX(), landingLocation.getY(), landingLocation.getZ()) + ).withStyle(ChatFormatting.WHITE); + + int coordsWidth = mc.font.width(coordsMessage); poseStack.pushPose(); + // Render keybind message if (mc.screen == null) { poseStack.pushPose(); + int messageWidth = mc.font.width(message); poseStack.translate(5 + messageWidth / 2f, -3 + screenHeight - mc.font.lineHeight / 2f, 0); guiGraphics.fill(-messageWidth / 2, -3 - mc.font.lineHeight / 2, messageWidth / 2, 2 + mc.font.lineHeight / 2, 0x88000000); - guiGraphics.drawString(mc.font, message.getString(), 8 - messageWidth / 2, -mc.font.lineHeight / 2, 0xFFFFFF, false); // White text + guiGraphics.drawString(mc.font, message.getString(), 8 - messageWidth / 2, -mc.font.lineHeight / 2, 0xFFFFFF, false); poseStack.popPose(); } + // Render fuel bar { poseStack.pushPose(); FUEL_BAR.animate = tardisClientData.isFlying(); poseStack.translate(20, 20, 0); FUEL_BAR.blit(guiGraphics, 0, 0, (double) remainingFuel / maxFuel); - guiGraphics.drawString(mc.font, fuelMessage.getString(), 3, 2, 0x572200, false); // White text + guiGraphics.drawString(mc.font, fuelMessage.getString(), 3, 2, 0x572200, false); poseStack.popPose(); } - guiGraphics.drawString(mc.font, throttleMessage.getString(), 20, 35, 0xFFFFFF, false); // White text + guiGraphics.drawString(mc.font, throttleMessage.getString(), 20, 35, 0xFFFFFF, false); float journeyProgress = tardisClientData.getJourneyProgress() / 100.0f; - poseStack.popPose(); + if(!tardisClientData.isFlying()) { + // Render player coordinates at the top-right corner + poseStack.pushPose(); + poseStack.translate(screenWidth - coordsWidth - 10, 10, 0); // Adjust position + guiGraphics.fill(-2, -3, coordsWidth + 2, mc.font.lineHeight + 2, 0x88000000); // Black background + guiGraphics.drawString(mc.font, coordsMessage.getString(), 0, 0, 0xFFFFFF, false); // White text + poseStack.popPose(); + } + // Render journey progress bar if (tardisClientData.isFlying()) renderJourneyProgressBar(guiGraphics, journeyProgress); + poseStack.popPose(); }); } + private static void renderPlayerHeads(PlayerInfo player, GuiGraphics guiGraphics, Minecraft mc, int x, int y) { // Render player's face and name if (player == null) return; diff --git a/common/src/main/java/whocraft/tardis_refined/client/overlays/VortexOverlay.java b/common/src/main/java/whocraft/tardis_refined/client/overlays/VortexOverlay.java index f7c8bd999..c7c932aa8 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/overlays/VortexOverlay.java +++ b/common/src/main/java/whocraft/tardis_refined/client/overlays/VortexOverlay.java @@ -12,14 +12,12 @@ import org.joml.Matrix4f; import whocraft.tardis_refined.client.TardisClientData; import whocraft.tardis_refined.client.renderer.vortex.VortexRenderer; -import whocraft.tardis_refined.client.screen.selections.ShellSelectionScreen; +import whocraft.tardis_refined.client.screen.screens.ShellSelectionScreen; import whocraft.tardis_refined.common.VortexRegistry; import whocraft.tardis_refined.common.capability.player.TardisPlayerInfo; -import java.util.Objects; - import static whocraft.tardis_refined.client.renderer.vortex.ShellRenderer.renderShell; -import static whocraft.tardis_refined.client.screen.selections.ShellSelectionScreen.globalShellBlockEntity; +import static whocraft.tardis_refined.client.screen.main.MonitorOS.MonitorOSExtension.GLOBALSHELL_BLOCKENTITY; public class VortexOverlay { @@ -36,7 +34,7 @@ public class VortexOverlay { private static long LAST_TIME = System.currentTimeMillis(); public static void update(GuiGraphics gg) { - if (globalShellBlockEntity == null) { + if (GLOBALSHELL_BLOCKENTITY == null) { ShellSelectionScreen.generateDummyGlobalShell(); return; } diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/console/GlobalConsoleRenderer.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/console/GlobalConsoleRenderer.java index 4474f5957..f9e62bda5 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/console/GlobalConsoleRenderer.java +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/console/GlobalConsoleRenderer.java @@ -14,7 +14,7 @@ import whocraft.tardis_refined.client.model.blockentity.console.ConsoleUnit; import whocraft.tardis_refined.client.model.blockentity.shell.ShellModelCollection; import whocraft.tardis_refined.client.renderer.RenderHelper; -import whocraft.tardis_refined.client.screen.selections.ShellSelectionScreen; +import whocraft.tardis_refined.client.screen.screens.ShellSelectionScreen; import whocraft.tardis_refined.common.block.console.GlobalConsoleBlock; import whocraft.tardis_refined.common.blockentity.console.GlobalConsoleBlockEntity; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; @@ -115,11 +115,11 @@ private void renderHoloShell(Vec3 offset, int rotation, GlobalConsoleBlockEntity poseStack.mulPose(Axis.YP.rotationDegrees(rotation % 360)); } - if (ShellSelectionScreen.globalShellBlockEntity == null) { + if (ShellSelectionScreen.GLOBALSHELL_BLOCKENTITY == null) { ShellSelectionScreen.generateDummyGlobalShell(); } - ShellSelectionScreen.globalShellBlockEntity.setTardisId(reactions.getLevelKey()); + ShellSelectionScreen.GLOBALSHELL_BLOCKENTITY.setTardisId(reactions.getLevelKey()); // Dynamic flickering alpha for a hologram effect float flickerAlpha = 0.2f + blockEntity.getLevel().random.nextFloat() * 0.1f; @@ -133,7 +133,7 @@ private void renderHoloShell(Vec3 offset, int rotation, GlobalConsoleBlockEntity model.setIgnoreAnmationAlpha(!reactions.isTakingOff() && !reactions.isLanding()); model.renderShell( - ShellSelectionScreen.globalShellBlockEntity, + ShellSelectionScreen.GLOBALSHELL_BLOCKENTITY, false, true, poseStack, diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/RenderTargetHelper.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/RenderTargetHelper.java index 920e746bb..a3863a750 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/RenderTargetHelper.java +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/RenderTargetHelper.java @@ -117,7 +117,7 @@ private static void renderDoorOpen(GlobalDoorBlockEntity blockEntity, PoseStack GL11.glColorMask(false, false, false, true); // Copy render target back to main buffer - + RENDER_TARGET_HELPER.end(); Minecraft.getInstance().getMainRenderTarget().bindWrite(true); copyRenderTarget(RENDER_TARGET_HELPER.renderTarget, Minecraft.getInstance().getMainRenderTarget()); GL11.glDisable(GL11.GL_STENCIL_TEST); // Disable stencil test diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/ShellRenderer.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/ShellRenderer.java index 75be7f8cc..87d5a2591 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/ShellRenderer.java +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/ShellRenderer.java @@ -18,7 +18,7 @@ import whocraft.tardis_refined.patterns.ShellPatterns; import static whocraft.tardis_refined.client.overlays.VortexOverlay.VORTEX; -import static whocraft.tardis_refined.client.screen.selections.ShellSelectionScreen.globalShellBlockEntity; +import static whocraft.tardis_refined.client.screen.screens.ShellSelectionScreen.GLOBALSHELL_BLOCKENTITY; public class ShellRenderer { @@ -56,17 +56,17 @@ public static void renderShell(GuiGraphics guiGraphics, float control, float alp //pose.translate(0, 1.5, 0); VertexConsumer vertexConsumer = guiGraphics.bufferSource().getBuffer(model.renderType(model.getShellTexture(ShellPatterns.getPatternOrDefault(shellTheme, shellPattern), false))); RenderSystem.enableBlend(); - globalShellBlockEntity.setTardisId(tardisClientData.getLevelKey()); - model.renderShell(globalShellBlockEntity, false, false, pose, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, alpha); + GLOBALSHELL_BLOCKENTITY.setTardisId(tardisClientData.getLevelKey()); + model.renderShell(GLOBALSHELL_BLOCKENTITY, false, false, pose, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, alpha); if (fullPattern.exteriorDoorTexture().emissive()) { VertexConsumer vertexConsumerLighting = guiGraphics.bufferSource().getBuffer(RenderType.entityTranslucentEmissive(model.getShellTexture(ShellPatterns.getPatternOrDefault(shellTheme, shellPattern), true))); - model.renderShell(globalShellBlockEntity, false, false, pose, vertexConsumerLighting, 15728880, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, alpha); + model.renderShell(GLOBALSHELL_BLOCKENTITY, false, false, pose, vertexConsumerLighting, 15728880, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, alpha); } VertexConsumer lightning = guiGraphics.bufferSource().getBuffer(RenderType.entityGlint()); if (VORTEX.lightning_strike > 0.4) { - model.renderShell(globalShellBlockEntity, false, false, pose, lightning, 15728880, OverlayTexture.NO_OVERLAY, 1, 1, 1, alpha); + model.renderShell(GLOBALSHELL_BLOCKENTITY, false, false, pose, lightning, 15728880, OverlayTexture.NO_OVERLAY, 1, 1, 1, alpha); } guiGraphics.flush(); diff --git a/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/VortexRenderer.java b/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/VortexRenderer.java index b828491d8..42af66979 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/VortexRenderer.java +++ b/common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/VortexRenderer.java @@ -27,19 +27,16 @@ public class VortexRenderer { private static final RandomSource RAND = RandomSource.create(); - public VortexRegistry vortexType; - public final RenderHelper.DynamicTimeKeep time = new RenderHelper.DynamicTimeKeep(2); + private final List vortex_quads = new ArrayList<>(); + public float opacity = 1; + public float lightning_strike = 0; public VortexRenderer(VortexRegistry type) { this.vortexType = type; } - private final List vortex_quads = new ArrayList<>(); - public float opacity = 1; - public float lightning_strike = 0; - /** * Renders the Time Vortex */ @@ -67,11 +64,11 @@ public void renderVortex(PoseStack pose, float opacity, boolean half) { Tesselator tesselator = beginTextureColor(Mode.QUADS); for (int i = 0; i < this.vortexType.getRows() / 2f; i++) { if (vortex_quads.size() < i + 1) { - vortex_quads.add(new VortexQuad(this.vortexType, this.time)); + vortex_quads.add(new VortexQuad()); break; } pose.pushPose(); - vortex_quads.get(i).renderQuad(pose, i / (this.vortexType.getRows() / 2f), this.opacity); + vortex_quads.get(i).renderQuad(pose, time, vortexType, i / (this.vortexType.getRows() / 2f), this.opacity); this.lightning_strike += vortex_quads.get(i).lightning_strike * vortex_quads.get(i).lightning_strike / (this.vortexType.getRows() / 2f); pose.popPose(); } @@ -181,20 +178,16 @@ private static class VortexQuad { private float u = 0, v = 0; private final float uvSize = 0.125f; private float lightning_a; - private final VortexRegistry vortexType; - private final RenderHelper.DynamicTimeKeep time; public float lightning_strike = 0; - public VortexQuad(VortexRegistry type, RenderHelper.DynamicTimeKeep time) { - this.vortexType = type; - this.time = time; + public VortexQuad() { } - private void rndQuad() { + private void rndQuad(VortexRegistry vortexType) { valid = true; prev_tO = 1; rndUV(); - lightning = RAND.nextBoolean() && this.vortexType.hasLightning(); + lightning = RAND.nextBoolean() && vortexType.hasLightning(); } private void rndUV() { @@ -203,8 +196,8 @@ private void rndUV() { } - public void renderQuad(PoseStack poseStack, float time_offset, float opacity) { - if (!valid) rndQuad(); + public void renderQuad(PoseStack poseStack, RenderHelper.DynamicTimeKeep time, VortexRegistry vortexType, float time_offset, float opacity) { + if (!valid) rndQuad(vortexType); float tO = -(time.getFloat(time_offset) * 2) - 1; if (tO > prev_tO || !valid) { @@ -236,12 +229,12 @@ public void renderQuad(PoseStack poseStack, float time_offset, float opacity) { alpha = Math.min(alpha, 1); alpha *= opacity; poseStack.pushPose(); - RenderHelper.rotateZYX(poseStack, 0, -this.vortexType.getTwist(), 0); - RenderHelper.rotateZYX(poseStack, 0, tO * this.vortexType.getRows() * this.vortexType.getTwist(), 0); - vertexUVColor(poseStack, x - s, tO, z + s, u0, v1, val, alpha, tO, !lightning); - vertexUVColor(poseStack, x + s, tO, z + s, u1, v1, val, alpha, tO, !lightning); - vertexUVColor(poseStack, x + s, tO, z - s, u1, v0, val, alpha, tO, !lightning); - vertexUVColor(poseStack, x - s, tO, z - s, u0, v0, val, alpha, tO, !lightning); + RenderHelper.rotateZYX(poseStack, 0, -vortexType.getTwist(), 0); + RenderHelper.rotateZYX(poseStack, 0, tO * vortexType.getRows() * vortexType.getTwist(), 0); + vertexUVColor(poseStack, x - s, tO, z + s, u0, v1, val, alpha, tO, !lightning, vortexType); + vertexUVColor(poseStack, x + s, tO, z + s, u1, v1, val, alpha, tO, !lightning, vortexType); + vertexUVColor(poseStack, x + s, tO, z - s, u1, v0, val, alpha, tO, !lightning, vortexType); + vertexUVColor(poseStack, x - s, tO, z - s, u0, v0, val, alpha, tO, !lightning, vortexType); poseStack.popPose(); prev_tO = tO; @@ -250,8 +243,8 @@ public void renderQuad(PoseStack poseStack, float time_offset, float opacity) { } - private void vertexUVColor(@NotNull PoseStack pose, float x, float y, float z, float u, float v, float val, float a, float o, boolean tint) { - float[] color = this.vortexType.getGradient().getRGBf(o); + private void vertexUVColor(@NotNull PoseStack pose, float x, float y, float z, float u, float v, float val, float a, float o, boolean tint, VortexRegistry vortexType) { + float[] color = vortexType.getGradient().getRGBf(o); if (tint) RenderHelper.vertexUVColor(pose, x, y, z, u, v, val * color[0], val * color[1], val * color[2], a); else diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/MonitorScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/MonitorScreen.java deleted file mode 100644 index dc0f9e746..000000000 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/MonitorScreen.java +++ /dev/null @@ -1,124 +0,0 @@ -package whocraft.tardis_refined.client.screen; - -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import whocraft.tardis_refined.TardisRefined; -import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; -import whocraft.tardis_refined.client.screen.components.SelectionListEntry; -import whocraft.tardis_refined.client.screen.selections.DesktopSelectionScreen; -import whocraft.tardis_refined.client.screen.selections.HumSelectionScreen; -import whocraft.tardis_refined.client.screen.selections.SelectionScreen; -import whocraft.tardis_refined.client.screen.selections.VortexSelectionScreen; -import whocraft.tardis_refined.common.VortexRegistry; -import whocraft.tardis_refined.common.capability.tardis.upgrades.UpgradeHandler; -import whocraft.tardis_refined.common.network.messages.C2SEjectPlayer; -import whocraft.tardis_refined.common.network.messages.player.C2SBeginShellView; -import whocraft.tardis_refined.common.network.messages.screens.C2SRequestShellSelection; -import whocraft.tardis_refined.common.network.messages.waypoints.C2SRequestWaypoints; -import whocraft.tardis_refined.common.tardis.TardisNavLocation; -import whocraft.tardis_refined.common.util.MiscHelper; -import whocraft.tardis_refined.constants.ModMessages; -import whocraft.tardis_refined.registry.TRUpgrades; - -import java.awt.*; - - -public class MonitorScreen extends SelectionScreen { - - public static ResourceLocation MONITOR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor.png"); - private final TardisNavLocation currentLocation; - private final TardisNavLocation targetLocation; - private final UpgradeHandler upgradeHandler; - protected int imageWidth = 256; - protected int imageHeight = 173; - private int leftPos, topPos; - private boolean noUpgrades = false; - - - public MonitorScreen(TardisNavLocation currentLocation, TardisNavLocation targetLocation, UpgradeHandler upgradeHandler) { - super(Component.translatable(ModMessages.UI_MONITOR_MAIN_TITLE)); - this.currentLocation = currentLocation; - this.targetLocation = targetLocation; - this.upgradeHandler = upgradeHandler; - } - - @Override - public boolean isPauseScreen() { - return false; - } - - @Override - protected void init() { - - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; - - //Super method already creates the list, we don't need to create it a second time. - super.init(); - } - - @Override - public GenericMonitorSelectionList createSelectionList() { - int leftPos = this.width / 2 - 75; - GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 250, 80, leftPos - 70, this.topPos + 30, this.topPos + this.imageHeight - 45, 10); - selectionList.setRenderBackground(false); - - selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_EXTERNAL_SHELL), entry -> new C2SRequestShellSelection().send(), leftPos, TRUpgrades.CHAMELEON_CIRCUIT_SYSTEM.get().isUnlocked(upgradeHandler))); - - selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_DESKTOP_CONFIGURATION), entry -> Minecraft.getInstance().setScreen(new DesktopSelectionScreen()), leftPos, TRUpgrades.INSIDE_ARCHITECTURE.get().isUnlocked(upgradeHandler))); - - selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_WAYPOINTS), entry -> new C2SRequestWaypoints().send(), leftPos, TRUpgrades.WAYPOINTS.get().isUnlocked(upgradeHandler))); - selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_SHELL_VIEW), entry -> new C2SBeginShellView().send(), leftPos, TRUpgrades.WAYPOINTS.get().isUnlocked(upgradeHandler))); - selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_VORTEX), entry -> Minecraft.getInstance().setScreen(new VortexSelectionScreen(VortexRegistry.VORTEX_REGISTRY.getKey(VortexRegistry.FLOW.get()))), leftPos)); - - - selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_SELECT_HUM), entry -> Minecraft.getInstance().setScreen(new HumSelectionScreen()), leftPos)); - selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_EJECT), entry -> { - new C2SEjectPlayer().send(); - Minecraft.getInstance().setScreen(null); - }, leftPos)); - - - if (selectionList.children().isEmpty()) { - noUpgrades = true; - } - - return selectionList; - } - - @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - super.render(guiGraphics, i, j, f); - int textOffset = height / 2 - 35; - - int upgradesLeftPos = this.width / 2 - 75; - - - if (noUpgrades) { - guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable(ModMessages.UI_NO_INSTALLED_SUBSYSTEMS).getString(), upgradesLeftPos, this.topPos + 30, ChatFormatting.GOLD.getColor()); - } - - this.renderTransparentBackground(guiGraphics); - - /*Render Back drop*/ - RenderSystem.setShader(GameRenderer::getPositionTexShader); - guiGraphics.blit(MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); - - int textScale = 40; - - guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable(ModMessages.UI_MONITOR_GPS).getString() + ":", width / 2 - 96, textOffset + 50, Color.WHITE.getRGB()); - ScreenHelper.renderWidthScaledText(currentLocation.getDirection().getName().toUpperCase() + " @ " + currentLocation.getPosition().toShortString(), guiGraphics, Minecraft.getInstance().font, width / 2 - 96, textOffset + 60, Color.LIGHT_GRAY.getRGB(), textScale * 2, 0.75F, false); - ScreenHelper.renderWidthScaledText(MiscHelper.getCleanDimensionName(currentLocation.getDimensionKey()), guiGraphics, Minecraft.getInstance().font, width / 2 - 96, textOffset + 70, Color.LIGHT_GRAY.getRGB(), textScale - 3, 1.5F, false); - - guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable(ModMessages.UI_MONITOR_DESTINATION).getString() + ":", width / 2 + 10, textOffset + 50, Color.WHITE.getRGB()); - ScreenHelper.renderWidthScaledText(targetLocation.getDirection().getName().toUpperCase() + " @ " + targetLocation.getPosition().toShortString(), guiGraphics, Minecraft.getInstance().font, width / 2 + 10, textOffset + 60, Color.LIGHT_GRAY.getRGB(), textScale * 2, 0.75F, false); - ScreenHelper.renderWidthScaledText(MiscHelper.getCleanDimensionName(targetLocation.getDimensionKey()), guiGraphics, Minecraft.getInstance().font, width / 2 + 10, textOffset + 70, Color.LIGHT_GRAY.getRGB(), textScale - 3, 1.5F, false); - - } - -} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/components/GenericMonitorSelectionList.java b/common/src/main/java/whocraft/tardis_refined/client/screen/components/GenericMonitorSelectionList.java index 48bdd980c..388c63b68 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/components/GenericMonitorSelectionList.java +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/components/GenericMonitorSelectionList.java @@ -30,7 +30,7 @@ public GenericMonitorSelectionList(Minecraft minecraft, int width, int height, i @Override protected int getScrollbarPosition() { - return this.x0 + this.width; + return this.x1 - 6; } @Override diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorOS.java b/common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorOS.java new file mode 100644 index 000000000..f4b74bd51 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorOS.java @@ -0,0 +1,367 @@ +package whocraft.tardis_refined.client.screen.main; + +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexSorting; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.ObjectSelectionList; +import net.minecraft.client.gui.components.SpriteIconButton; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; +import whocraft.tardis_refined.TardisRefined; +import whocraft.tardis_refined.client.TardisClientData; +import whocraft.tardis_refined.client.model.blockentity.shell.ShellModel; +import whocraft.tardis_refined.client.model.blockentity.shell.ShellModelCollection; +import whocraft.tardis_refined.client.renderer.vortex.VortexRenderer; +import whocraft.tardis_refined.client.screen.ScreenHelper; +import whocraft.tardis_refined.client.screen.components.CommonTRWidgets; +import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.screens.VortexSelectionScreen; +import whocraft.tardis_refined.common.VortexRegistry; +import whocraft.tardis_refined.common.blockentity.shell.GlobalShellBlockEntity; +import whocraft.tardis_refined.common.tardis.themes.ShellTheme; +import whocraft.tardis_refined.patterns.ShellPattern; +import whocraft.tardis_refined.patterns.ShellPatterns; +import whocraft.tardis_refined.registry.TRBlockRegistry; + +import java.awt.*; +import java.util.List; +import java.util.UUID; + +public class MonitorOS extends Screen { + + public static ResourceLocation FRAME = new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/frame_brass.png"); + protected static final int frameWidth = 256, frameHeight = 180; + protected static final int monitorWidth = 230, monitorHeight = 130; + public final ResourceLocation backdrop; + public static final VortexRenderer VORTEX = new VortexRenderer(VortexRegistry.CLOUDS.get()); + public static ResourceLocation currentVortex = VortexRegistry.VORTEX_REGISTRY.getKey(VortexRegistry.CLOUDS.get()); + public static ResourceLocation NOISE = new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/noise.png"); + public static ResourceLocation SYMBLS = new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/gallifreyan_symbols.png"); + + public MonitorOS LEFT; + public MonitorOS RIGHT; + public MonitorOS PREVIOUS; + + public static final ResourceLocation BUTTON_LOCATION = new ResourceLocation(TardisRefined.MODID, "save"); + public static final ResourceLocation BCK_LOCATION = new ResourceLocation(TardisRefined.MODID, "back"); + public int shakeX, shakeY, age, transitionStartTime = -1; + public float shakeAlpha; + private MonitorOSRun onSubmit; + private MonitorOSRun onCancel; + + public MonitorOS(Component title, ResourceLocation backdrop) { + super(title); + this.backdrop = backdrop; + } + + @Override + protected void init() { + super.init(); + ObjectSelectionList list = createSelectionList(); + if (list != null) this.addRenderableWidget(list); + } + + @Override + public void renderBackground(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + } + + public void render2Background(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + guiGraphics.enableScissor(0, 0, width, vPos + shakeY); + super.renderBackground(guiGraphics, mouseX, mouseY, partialTick); + guiGraphics.disableScissor(); + guiGraphics.enableScissor(0, vPos + shakeY, hPos + shakeX, height - vPos + shakeY); + super.renderBackground(guiGraphics, mouseX, mouseY, partialTick); + guiGraphics.disableScissor(); + guiGraphics.enableScissor(width - hPos + shakeX, vPos + shakeY, width, height - vPos + shakeY); + super.renderBackground(guiGraphics, mouseX, mouseY, partialTick); + guiGraphics.disableScissor(); + guiGraphics.enableScissor(0, height - vPos + shakeY, width, height); + super.renderBackground(guiGraphics, mouseX, mouseY, partialTick); + guiGraphics.disableScissor(); + } + + + public void renderVortex(@NotNull GuiGraphics guiGraphics) { + PoseStack poseStack = guiGraphics.pose(); + + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + guiGraphics.enableScissor(hPos + shakeX, vPos + shakeY, width - hPos + shakeX, height - vPos + shakeY); + RenderSystem.backupProjectionMatrix(); + assert minecraft != null; + Matrix4f perspective = new Matrix4f(); + perspective.perspective((float) Math.toRadians(minecraft.options.fov().get()), (float) width / (float) height, 0.01f, 9999, false, perspective); + perspective.translate(0, 0, 11000f); + RenderSystem.setProjectionMatrix(perspective, VertexSorting.DISTANCE_TO_ORIGIN); + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(20)); + + // Blindly assume that the player is not doing weird stuff to open the menu outside a TARDIS + assert Minecraft.getInstance().level != null; + TardisClientData tardisClientData = TardisClientData.getInstance(Minecraft.getInstance().level.dimension()); + + VORTEX.vortexType = VortexRegistry.VORTEX_REGISTRY.get(this instanceof VortexSelectionScreen ? VortexSelectionScreen.currentVortex : tardisClientData.getVortex()); + VORTEX.time.speed = 0.3; + VORTEX.renderVortex(guiGraphics, 1, false); + RenderSystem.restoreProjectionMatrix(); + poseStack.popPose(); + guiGraphics.disableScissor(); + } + + public void renderBackdrop(@NotNull GuiGraphics guiGraphics) { + if (backdrop == null) return; + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + guiGraphics.blit(backdrop, hPos, vPos, 0, 0, monitorWidth, monitorHeight); + int b = height - vPos, r = width - hPos; + guiGraphics.fill(hPos, vPos, r, b, 0x40000000); + } + + @Override + public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + render2Background(guiGraphics, mouseX, mouseY, partialTick); + RenderSystem.enableBlend(); + renderVortex(guiGraphics); + + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + guiGraphics.enableScissor(hPos, vPos, width - hPos, height - vPos); + + PoseStack poseStack = guiGraphics.pose(); + poseStack.pushPose(); + poseStack.translate(shakeX, shakeY, 0); + + int symb = 0 % 64; + poseStack.pushPose(); + poseStack.translate(hPos + 10, vPos + 10, 0); + poseStack.scale(2, 2, 1); + poseStack.mulPose(Axis.ZP.rotationDegrees((float) (System.currentTimeMillis() % 5400L) / 15L)); + poseStack.translate(-31 / 2f, -31 / 2f, 0); + guiGraphics.blit(SYMBLS, 0, 0, 32 * (symb % 8), 32 * (symb / 8), 32, 32); + poseStack.popPose(); + + symb = 3 % 64; + poseStack.pushPose(); + poseStack.translate(hPos + monitorWidth - 10, vPos + monitorHeight - 10, 0); + poseStack.scale(2, 2, 1); + poseStack.mulPose(Axis.ZP.rotationDegrees((float) (System.currentTimeMillis() % 5400L) / 15L)); + poseStack.translate(-31 / 2f, -31 / 2f, 0); + guiGraphics.blit(SYMBLS, 0, 0, 32 * (symb % 8), 32 * (symb / 8), 32, 32); + poseStack.popPose(); + + symb = 9 % 64; + poseStack.pushPose(); + poseStack.translate(hPos + 10, vPos + monitorHeight - 10, 0); + poseStack.scale(2, 2, 1); + poseStack.mulPose(Axis.ZP.rotationDegrees(-(float) (System.currentTimeMillis() % 5400L) / 15L)); + poseStack.translate(-31 / 2f, -31 / 2f, 0); + guiGraphics.blit(SYMBLS, 0, 0, 32 * (symb % 8), 32 * (symb / 8), 32, 32); + poseStack.popPose(); + + symb = 8 % 64; + poseStack.pushPose(); + poseStack.translate(hPos + monitorWidth - 10, vPos + 10, 0); + poseStack.scale(2, 2, 1); + poseStack.mulPose(Axis.ZP.rotationDegrees(-(float) (System.currentTimeMillis() % 5400L) / 15L)); + poseStack.translate(-31 / 2f, -31 / 2f, 0); + guiGraphics.blit(SYMBLS, 0, 0, 32 * (symb % 8), 32 * (symb / 8), 32, 32); + poseStack.popPose(); + + boolean right = RIGHT != null && PREVIOUS != null && RIGHT == PREVIOUS && transitionStartTime >= 0; + boolean left = LEFT != null && PREVIOUS != null && LEFT == PREVIOUS && transitionStartTime >= 0; + float t = (age - transitionStartTime + partialTick) / 10f; + float o = -0.5f * Mth.cos(Mth.PI * t) + 0.5f; + + if (right || left) RenderSystem.setShaderColor(1, 1, 1, o); + RenderSystem.enableBlend(); + renderBackdrop(guiGraphics); + RenderSystem.enableBlend(); + if (right || left) RenderSystem.setShaderColor(1, 1, 1, 1 - o); + if (right) { + RIGHT.renderBackdrop(guiGraphics); + poseStack.translate(monitorWidth * o, 0, 0); + RIGHT.doRender(guiGraphics, mouseX, mouseY, partialTick); + } + + if (left) { + LEFT.renderBackdrop(guiGraphics); + poseStack.translate(-monitorWidth * o, 0, 0); + LEFT.doRender(guiGraphics, mouseX, mouseY, partialTick); + } + + if (right || left) poseStack.translate(right ? -monitorWidth : monitorWidth, 0, 0); + RenderSystem.setShaderColor(1, 1, 1, 1); + doRender(guiGraphics, mouseX, mouseY, partialTick); + + poseStack.popPose(); + + guiGraphics.disableScissor(); + RenderSystem.enableBlend(); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, (shakeAlpha + 1 - partialTick) / 100.0f); + guiGraphics.blit(NOISE, hPos + shakeX, vPos + shakeY, (int) (Math.random() * 736), (int) (414 * (System.currentTimeMillis() % 1000) / 1000.0), monitorWidth, monitorHeight); + RenderSystem.setShaderColor(1, 1, 1, 1); + + renderFrame(guiGraphics, mouseX, mouseY, partialTick); + RenderSystem.disableBlend(); + } + + public void doRender(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + inMonitorRender(guiGraphics, mouseX, mouseY, partialTick); + RenderSystem.setShaderColor(1, 1, 1, 1); + super.render(guiGraphics, mouseX, mouseY, partialTick); + ScreenHelper.renderWidthScaledText(title.getString(), guiGraphics, Minecraft.getInstance().font, width / 2f, 5 + (height - monitorHeight) / 2f, Color.LIGHT_GRAY.getRGB(), 300, true); + } + + public void inMonitorRender(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + } + + public void renderFrame(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + int hPos = (width - frameWidth) / 2; + int vPos = -13 + (height - monitorHeight) / 2; + + guiGraphics.blit(FRAME, hPos + shakeX, vPos + shakeY, 0, 0, frameWidth, frameHeight); + } + + @Override + public void tick() { + super.tick(); + this.age++; + if (transitionStartTime >= 0 && age - transitionStartTime >= 10) transitionStartTime = -1; + + if (minecraft == null || minecraft.level == null) return; + boolean isCrashed = TardisClientData.getInstance(minecraft.level.dimension()).isCrashing(); + + this.shakeAlpha--; + + if (isCrashed) this.shakeAlpha = 50; + if (shakeAlpha < 0) shakeAlpha = 0; + + if (shakeAlpha > 0) { + this.shakeX = (int) (this.shakeAlpha * (Math.random() - 0.5) * 0.5); + this.shakeY = (int) (this.shakeAlpha * (Math.random() - 0.5) * 0.5); + } + } + + public void switchScreenToLeft(MonitorOS next) { + this.LEFT = next; + next.PREVIOUS = this; + next.RIGHT = this; + next.transition(); + Minecraft.getInstance().setScreen(next); + } + + public void switchScreenToRight(MonitorOS next) { + this.RIGHT = next; + next.PREVIOUS = this; + next.LEFT = this; + next.transition(); + Minecraft.getInstance().setScreen(next); + } + + public void transition() { + transitionStartTime = age; + } + + public void setEvents(MonitorOSRun onSubmit, MonitorOSRun onCancel) { + this.onSubmit = onSubmit; + this.onCancel = onCancel; + } + + public void addSubmitButton(int x, int y) { + if (onSubmit != null) { + SpriteIconButton spriteiconbutton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Submit"), (arg) -> this.onSubmit.onPress(), true, BUTTON_LOCATION)); + spriteiconbutton.setPosition(x, y); + } + } + + public void addCancelButton(int x, int y) { + if (onCancel != null) { + SpriteIconButton spriteiconbutton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Cancel"), (arg) -> this.onCancel.onPress(), true, BCK_LOCATION)); + spriteiconbutton.setPosition(x, y); + } + } + + public ObjectSelectionList createSelectionList() { + return null; + } + + @Override + public boolean isPauseScreen() { + return false; + } + + public interface MonitorOSRun { + void onPress(); + } + + public static class MonitorOSExtension extends MonitorOS { + + public MonitorOSExtension(Component title, ResourceLocation currentShellThem) { + super(title, null); + CURRENTSHELLTHEME = currentShellThem; + PATTERNCOLLECTION = ShellPatterns.getPatternCollectionForTheme(CURRENTSHELLTHEME); + THEMELIST = ShellTheme.SHELL_THEME_REGISTRY.keySet().stream().toList(); + generateDummyGlobalShell(); + } + + @Override + protected void init() { + super.init(); + if (CURRENTSHELLTHEME == null) CURRENTSHELLTHEME = THEMELIST.get(0); + if (PATTERN == null) PATTERN = PATTERNCOLLECTION.get(0); + } + + public static GlobalShellBlockEntity GLOBALSHELL_BLOCKENTITY; + public static ResourceLocation CURRENTSHELLTHEME; + public static ShellPattern PATTERN; + public static List THEMELIST; + public static List PATTERNCOLLECTION; + + public void renderShell(GuiGraphics guiGraphics, int x, int y, float scale) { + ShellModel model = ShellModelCollection.getInstance().getShellEntry(CURRENTSHELLTHEME).getShellModel(PATTERN); + model.setDoorPosition(false); + Lighting.setupForEntityInInventory(); + PoseStack pose = guiGraphics.pose(); + pose.pushPose(); + pose.translate((float) x, y, 100.0F); + pose.scale(-scale, scale, scale); + pose.mulPose(Axis.XP.rotationDegrees(-15F)); + pose.mulPose(Axis.YP.rotationDegrees((float) (System.currentTimeMillis() % 5400L) / 15L)); + + VertexConsumer vertexConsumer = guiGraphics.bufferSource().getBuffer(model.renderType(model.getShellTexture(PATTERN, false))); + model.renderShell(GLOBALSHELL_BLOCKENTITY, false, false, pose, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + guiGraphics.flush(); + pose.popPose(); + Lighting.setupFor3DItems(); + } + + public static void generateDummyGlobalShell() { + GLOBALSHELL_BLOCKENTITY = new GlobalShellBlockEntity(BlockPos.ZERO, TRBlockRegistry.GLOBAL_SHELL_BLOCK.get().defaultBlockState()); + assert Minecraft.getInstance().level != null; + GLOBALSHELL_BLOCKENTITY.setLevel(Minecraft.getInstance().level); + ResourceKey generatedLevelKey = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(TardisRefined.MODID, UUID.randomUUID().toString())); + GLOBALSHELL_BLOCKENTITY.setTardisId(generatedLevelKey); + GLOBALSHELL_BLOCKENTITY.setShellTheme(ShellTheme.POLICE_BOX.getId()); + GLOBALSHELL_BLOCKENTITY.setPattern(ShellPatterns.DEFAULT); + } + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorScreen.java new file mode 100644 index 000000000..aa7d1b3fe --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/main/MonitorScreen.java @@ -0,0 +1,180 @@ +package whocraft.tardis_refined.client.screen.main; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import whocraft.tardis_refined.TardisRefined; +import whocraft.tardis_refined.client.screen.ScreenHelper; +import whocraft.tardis_refined.client.screen.components.BackgroundlessButton; +import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; +import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.ponder.PonderListScreen; +import whocraft.tardis_refined.client.screen.ponder.PonderScreen; +import whocraft.tardis_refined.client.screen.screens.DesktopSelectionScreen; +import whocraft.tardis_refined.client.screen.screens.HumSelectionScreen; +import whocraft.tardis_refined.client.screen.screens.VortexSelectionScreen; +import whocraft.tardis_refined.common.VortexRegistry; +import whocraft.tardis_refined.common.capability.tardis.upgrades.UpgradeHandler; +import whocraft.tardis_refined.common.crafting.astral_manipulator.ManipulatorCraftingRecipe; +import whocraft.tardis_refined.common.crafting.astral_manipulator.ManipulatorRecipes; +import whocraft.tardis_refined.common.network.messages.C2SEjectPlayer; +import whocraft.tardis_refined.common.network.messages.player.C2SBeginShellView; +import whocraft.tardis_refined.common.network.messages.screens.C2SRequestShellSelection; +import whocraft.tardis_refined.common.network.messages.waypoints.C2SRequestWaypoints; +import whocraft.tardis_refined.common.tardis.TardisNavLocation; +import whocraft.tardis_refined.common.util.MiscHelper; +import whocraft.tardis_refined.constants.ModMessages; +import whocraft.tardis_refined.registry.TRUpgrades; + +import java.awt.*; + + +public class MonitorScreen extends MonitorOS.MonitorOSExtension { + + private final TardisNavLocation currentLocation; + private final TardisNavLocation targetLocation; + private final UpgradeHandler upgradeHandler; + + private boolean noUpgrades = false; + + public MonitorScreen(TardisNavLocation currentLocation, TardisNavLocation targetLocation, UpgradeHandler upgradeHandler, ResourceLocation currentShellTheme) { + super(Component.translatable(ModMessages.UI_MONITOR_MAIN_TITLE), currentShellTheme); + this.currentLocation = currentLocation; + this.targetLocation = targetLocation; + this.upgradeHandler = upgradeHandler; + } + + private Button ejectbtn; + private int ejectbtntime; + private boolean ejectbtnshow; + + @Override + protected void init() { + super.init(); + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + //shellSelectButton.active = TRUpgrades.CHAMELEON_CIRCUIT_SYSTEM.get().isUnlocked(upgradeHandler); +/* + Button vortxSelectButton = addRenderableWidget( + Button.builder(Component.translatable(ModMessages.UI_MONITOR_VORTEX), + button -> this.switchScreenToLeft(new VortexSelectionScreen(currentVortex))) + .pos(hPos + 5, -20 + height / 2) + .size(70, 20).build()); + vortxSelectButton.active = true; +*/ + BackgroundlessButton extView = addRenderableWidget(BackgroundlessButton.backgroundlessBuilder(Component.literal(""), button -> new C2SBeginShellView().send()).pos(hPos + 20, -30 + height / 2).size(40, 60).build()); + extView.setTooltip(Tooltip.create(Component.translatable(ModMessages.UI_MONITOR_SHELL_VIEW))); + extView.active = true; + + ejectbtn = addRenderableWidget(Button.builder(Component.translatable(ModMessages.UI_MONITOR_EJECT), button -> { + new C2SEjectPlayer().send(); + Minecraft.getInstance().setScreen(null); + }).pos(-35 + hPos + monitorWidth / 2, vPos + monitorHeight - 20).size(70, 20).build()); + + } + + @Override + public void renderBackdrop(@NotNull GuiGraphics guiGraphics) { + super.renderBackdrop(guiGraphics); + + PoseStack poseStack = guiGraphics.pose(); + + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + poseStack.pushPose(); + int b = height - vPos, r = width - hPos; + int l1 = hPos + monitorWidth / 5, l2 = (int) (hPos + monitorWidth / 2.5f); + + guiGraphics.fill(l1, vPos, r, b, -1072689136); + poseStack.translate(l1, vPos, 0); + poseStack.mulPose(Axis.ZP.rotationDegrees(90)); + guiGraphics.fillGradient(0, 0, monitorHeight, l1 - hPos, -1072689136, 0x00000000); + poseStack.popPose(); + } + + @Override + public void inMonitorRender(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + PoseStack poseStack = guiGraphics.pose(); + int upgradesLeftPos = width / 2 - 75; + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + + this.ejectbtnshow = (mouseY >= vPos + monitorHeight - 20 && mouseY <= vPos + monitorHeight) && (mouseX >= -35 + hPos + monitorWidth / 2 && mouseX <= 70 - 35 + hPos + monitorWidth / 2); + + ejectbtn.setPosition(-35 + hPos + monitorWidth / 2, vPos + monitorHeight - ejectbtntime); + ejectbtn.active = ejectbtntime == 20; + + + if (noUpgrades && ChatFormatting.GOLD.getColor() != null) { + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable(ModMessages.UI_NO_INSTALLED_SUBSYSTEMS).getString(), upgradesLeftPos, vPos + 30, ChatFormatting.GOLD.getColor()); + } + + poseStack.pushPose(); + poseStack.translate(0, 0, 1000); + renderShell(guiGraphics, hPos + 40, -1 + height / 2, 15F); + poseStack.popPose(); + + int textScale = 40; + + poseStack.pushPose(); + poseStack.translate(hPos + 10, vPos + 10, 0); + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable(ModMessages.UI_MONITOR_GPS).getString() + ":", 0, 0, Color.WHITE.getRGB()); + ScreenHelper.renderWidthScaledText(currentLocation.getDirection().getName().toUpperCase() + " @ " + currentLocation.getPosition().toShortString(), guiGraphics, Minecraft.getInstance().font, 0, 10, Color.LIGHT_GRAY.getRGB(), textScale * 2, 0.75F, false); + ScreenHelper.renderWidthScaledText(MiscHelper.getCleanDimensionName(currentLocation.getDimensionKey()), guiGraphics, Minecraft.getInstance().font, 0, 20, Color.LIGHT_GRAY.getRGB(), textScale - 3, 1.5F, false); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.translate(hPos + 10, vPos + monitorHeight - 35, 0); + guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable(ModMessages.UI_MONITOR_DESTINATION).getString() + ":", 0, 0, Color.WHITE.getRGB()); + ScreenHelper.renderWidthScaledText(targetLocation.getDirection().getName().toUpperCase() + " @ " + targetLocation.getPosition().toShortString(), guiGraphics, Minecraft.getInstance().font, 0, 10, Color.LIGHT_GRAY.getRGB(), textScale * 2, 0.75F, false); + ScreenHelper.renderWidthScaledText(MiscHelper.getCleanDimensionName(targetLocation.getDimensionKey()), guiGraphics, Minecraft.getInstance().font, 0, 20, Color.LIGHT_GRAY.getRGB(), textScale - 3, 1.5F, false); + poseStack.popPose(); + } + + @Override + public void tick() { + super.tick(); + + if (ejectbtnshow) ejectbtntime += 5 - ejectbtntime / 4; + else ejectbtntime -= 5 - (20 - ejectbtntime) / 4; + if (ejectbtntime > 20) ejectbtntime = 20; + if (ejectbtntime < 5) ejectbtntime = 5; + + } + + @Override + public GenericMonitorSelectionList createSelectionList() { + int hPos = -20 + width / 2; + int vPos = 20 + (height - monitorHeight) / 2; + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 15 + monitorWidth / 2, 80, hPos, vPos, height - vPos, 12); + selectionList.setRenderBackground(false); + selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_EXTERNAL_SHELL), entry -> new C2SRequestShellSelection().send(), hPos, TRUpgrades.CHAMELEON_CIRCUIT_SYSTEM.get().isUnlocked(upgradeHandler))); + selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_DESKTOP_CONFIGURATION), entry -> switchScreenToRight(new DesktopSelectionScreen()), hPos, TRUpgrades.INSIDE_ARCHITECTURE.get().isUnlocked(upgradeHandler))); + selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_WAYPOINTS), entry -> new C2SRequestWaypoints().send(), hPos, TRUpgrades.WAYPOINTS.get().isUnlocked(upgradeHandler))); + //selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_SHELL_VIEW), entry -> new C2SBeginShellView().send(), hPos, TRUpgrades.WAYPOINTS.get().isUnlocked(upgradeHandler))); + selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_VORTEX), entry -> switchScreenToRight(new VortexSelectionScreen(currentVortex)), hPos)); + selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_SELECT_HUM), entry -> switchScreenToRight(new HumSelectionScreen()), hPos)); + //selectionList.children().add(new SelectionListEntry(Component.translatable(ModMessages.UI_MONITOR_EJECT), entry -> { + // new C2SEjectPlayer().send(); + // Minecraft.getInstance().setScreen(null); + //}, hPos)); + + if (selectionList.children().isEmpty()) { + noUpgrades = true; + return null; + } + + return selectionList; + } + +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderListScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderListScreen.java new file mode 100644 index 000000000..27af9bc15 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderListScreen.java @@ -0,0 +1,50 @@ +package whocraft.tardis_refined.client.screen.ponder; + +import com.mojang.brigadier.StringReader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.ObjectSelectionList; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import whocraft.tardis_refined.TardisRefined; +import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; +import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.common.crafting.astral_manipulator.ManipulatorCraftingRecipe; +import whocraft.tardis_refined.common.hum.HumEntry; +import whocraft.tardis_refined.common.hum.TardisHums; +import whocraft.tardis_refined.common.util.MiscHelper; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +public class PonderListScreen extends MonitorOS { + + public PonderListScreen() { + super(Component.literal(""), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); + } + + @Override + public ObjectSelectionList createSelectionList() { + int vPos = (height - monitorHeight) / 2; + int leftPos = this.width / 2 - 75; + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 150, 80, leftPos, vPos + 15, vPos + monitorHeight - 30, 12); + selectionList.setRenderBackground(false); + + if (Minecraft.getInstance().level == null) return null; + if (ManipulatorCraftingRecipe.getAllRecipes(Minecraft.getInstance().level).isEmpty()) return null; + + List recipes = ManipulatorCraftingRecipe.getAllRecipes(Minecraft.getInstance().level); + + + for (ManipulatorCraftingRecipe recipe : recipes) { + Component name = PonderScreen.getResultName(recipe); + + selectionList.children().add(new SelectionListEntry(name, (entry) -> { + Minecraft.getInstance().setScreen(new PonderScreen(recipe)); + }, leftPos)); + } + + return selectionList; + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderScreen.java new file mode 100644 index 000000000..6f4864454 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/ponder/PonderScreen.java @@ -0,0 +1,177 @@ +package whocraft.tardis_refined.client.screen.ponder; + +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.ObjectSelectionList; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import whocraft.tardis_refined.TardisRefined; +import whocraft.tardis_refined.client.ScreenHandler; +import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; +import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.common.crafting.astral_manipulator.ManipulatorBlockResult; +import whocraft.tardis_refined.common.crafting.astral_manipulator.ManipulatorCraftingIngredient; +import whocraft.tardis_refined.common.crafting.astral_manipulator.ManipulatorCraftingRecipe; +import whocraft.tardis_refined.common.crafting.astral_manipulator.ManipulatorItemResult; + +import java.util.HashMap; +import java.util.Map; + +public class PonderScreen extends MonitorOS { + + private final ManipulatorCraftingRecipe recipe; + private final int xSize, ySize, zSize; + private int age = 0; + + // Variables for rotation + private float rotationX = -45F; + private float rotationY = 45F; + private boolean isDragging = false; + + public PonderScreen(ManipulatorCraftingRecipe recipe) { + super(getResultName(recipe), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); + + this.setEvents(() -> { + + }, ScreenHandler::openCraftingScreen); + + this.recipe = recipe; + int minX = 100, maxX = -100, minY = 100, maxY = -100, minZ = 100, maxZ = -100; + for (ManipulatorCraftingIngredient ingredient : recipe.ingredients()) { + BlockPos pos = ingredient.relativeBlockPos(); + minX = Math.min(minX, pos.getX()); + maxX = Math.max(maxX, pos.getX()); + minY = Math.min(minY, pos.getY()); + maxY = Math.max(maxY, pos.getY()); + minZ = Math.min(minZ, pos.getZ()); + maxZ = Math.max(maxZ, pos.getZ()); + } + xSize = maxX - minX; + ySize = maxY - minY; + zSize = maxZ - minZ; + } + + public static Component getResultName(ManipulatorCraftingRecipe recipe) { + if (recipe.result() instanceof ManipulatorBlockResult blockResult) { + BlockState blockState = blockResult.recipeOutput(); + return blockState.getBlock().getName(); + } else if (recipe.result() instanceof ManipulatorItemResult itemResult) { + ItemStack itemStack = itemResult.recipeOutput(); + return itemStack.getHoverName(); + } + return Component.literal("What on earth are you crafting?"); + } + + @Override + protected void init() { + super.init(); + int vPos = (height - monitorHeight) / 2; + addCancelButton(width / 2 - 105, height - vPos - 25); + } + + @Override + public ObjectSelectionList createSelectionList() { + int leftPos = width / 2; + int topPos = (height - monitorHeight) / 2; + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>( + this.minecraft, 105, 80, leftPos, topPos + 15, topPos + monitorHeight - 30, 12 + ); + selectionList.setRenderBackground(false); + + // Map to track item names and their counts + Map itemCounts = new HashMap<>(); + for (ManipulatorCraftingIngredient ingredient : recipe.ingredients()) { + String itemName = new ItemStack(ingredient.inputBlockState().getBlock()).getHoverName().getString(); + itemCounts.put(itemName, itemCounts.getOrDefault(itemName, 0) + 1); + } + + // Add entries to the selection list with item count + for (Map.Entry entry : itemCounts.entrySet()) { + String itemNameWithCount = entry.getValue() + "x " + entry.getKey(); + SelectionListEntry selectionListEntry = new SelectionListEntry( + Component.literal(itemNameWithCount), (entryCallback) -> { + }, leftPos); + selectionList.children().add(selectionListEntry); + } + + return selectionList; + } + + @Override + public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + super.render(guiGraphics, mouseX, mouseY, partialTick); + assert minecraft != null; + + if (recipe.ingredients().isEmpty()) return; + + PoseStack pose = guiGraphics.pose(); + + Lighting.setupFor3DItems(); + pose.pushPose(); + pose.translate((float) width / 2 - 50, height / 2f, 500); + pose.mulPose(Axis.XP.rotationDegrees(rotationX / 2)); + pose.mulPose(Axis.YP.rotationDegrees(rotationY)); + pose.scale(-20, -20, -20); + pose.translate(-xSize / 2f, -ySize / 2f, -zSize / 2f); + + int i = 0; + int e = age / 10; + for (ManipulatorCraftingIngredient ingredient : recipe.ingredients()) { + if (i > e % recipe.ingredients().size()) break; + BlockState s = ingredient.inputBlockState(); + BlockPos pos = ingredient.relativeBlockPos(); + pose.pushPose(); + pose.translate(pos.getX(), pos.getY(), pos.getZ()); + assert minecraft.level != null; + RenderSystem.setShaderColor(1, 1, 1, 1); + minecraft.getBlockRenderer().renderSingleBlock(s, guiGraphics.pose(), guiGraphics.bufferSource(), LightTexture.FULL_BLOCK, OverlayTexture.NO_OVERLAY); + pose.popPose(); + i++; + } + + guiGraphics.flush(); + Lighting.setupFor3DItems(); + pose.popPose(); + } + + @Override + public void tick() { + super.tick(); + age++; + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + if (isDragging) { + rotationY += (float) (deltaX * 0.5f); + rotationX -= (float) (deltaY * 0.5f); + rotationX = Math.max(-90, Math.min(90, rotationX)); + } + return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + isDragging = true; + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0) { // Left mouse button + isDragging = false; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/CancelDesktopScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/CancelDesktopScreen.java similarity index 59% rename from common/src/main/java/whocraft/tardis_refined/client/screen/CancelDesktopScreen.java rename to common/src/main/java/whocraft/tardis_refined/client/screen/screens/CancelDesktopScreen.java index 5ab13d988..607f9147e 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/CancelDesktopScreen.java +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/CancelDesktopScreen.java @@ -1,27 +1,27 @@ -package whocraft.tardis_refined.client.screen; +package whocraft.tardis_refined.client.screen.screens; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import whocraft.tardis_refined.TardisRefined; +import whocraft.tardis_refined.client.screen.ScreenHelper; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.client.screen.main.MonitorScreen; import whocraft.tardis_refined.common.network.messages.C2SCancelDesktopChange; import whocraft.tardis_refined.constants.ModMessages; import java.awt.*; -public class CancelDesktopScreen extends Screen { - - protected int imageWidth = 256; - protected int imageHeight = 173; - private int leftPos, topPos; - +public class CancelDesktopScreen extends MonitorOS { public CancelDesktopScreen() { - super(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_DESKTOP)); + super(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_DESKTOP), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); } @Override @@ -29,7 +29,6 @@ public boolean isPauseScreen() { return true; } - @Override protected void init() { super.init(); @@ -42,30 +41,13 @@ protected void init() { Minecraft.getInstance().setScreen(null); }).bounds(this.width / 2 - (175 / 2), this.height / 2 + 30, 175, 20).build()); - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; } - @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - this.renderTransparentBackground(guiGraphics); - - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - guiGraphics.blit(MonitorScreen.MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); - - ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_TITLE).getString(), guiGraphics, Minecraft.getInstance().font, width / 2, height / 2 - 30, Color.LIGHT_GRAY.getRGB(), 300, true); - ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_DESCRIPTION).getString(), guiGraphics, Minecraft.getInstance().font, width / 2, this.height / 2 - 20, Color.WHITE.getRGB(), 210, true); - ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_DESKTOP).getString(), guiGraphics, Minecraft.getInstance().font, width / 2, this.height / 2 - 10, Color.WHITE.getRGB(), 210, true); - - - super.render(guiGraphics, i, j, f); - + public void inMonitorRender(@NotNull GuiGraphics guiGraphics, int i, int j, float f) { + ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_TITLE).getString(), guiGraphics, Minecraft.getInstance().font, width / 2f, height / 2f - 30, Color.LIGHT_GRAY.getRGB(), 300, true); + ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_DESCRIPTION).getString(), guiGraphics, Minecraft.getInstance().font, width / 2f, this.height / 2f - 20, Color.WHITE.getRGB(), 210, true); + ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_DESKTOP_CANCEL_DESKTOP).getString(), guiGraphics, Minecraft.getInstance().font, width / 2f, this.height / 2f - 10, Color.WHITE.getRGB(), 210, true); } - @Override - public void renderBackground(GuiGraphics guiGraphics, int i, int j, float f) { - - } } diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/DesktopSelectionScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/DesktopSelectionScreen.java similarity index 56% rename from common/src/main/java/whocraft/tardis_refined/client/screen/selections/DesktopSelectionScreen.java rename to common/src/main/java/whocraft/tardis_refined/client/screen/screens/DesktopSelectionScreen.java index 886103e52..ffeba3a93 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/DesktopSelectionScreen.java +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/DesktopSelectionScreen.java @@ -1,18 +1,20 @@ -package whocraft.tardis_refined.client.screen.selections; +package whocraft.tardis_refined.client.screen.screens; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.brigadier.StringReader; +import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.ObjectSelectionList; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.main.MonitorOS; import whocraft.tardis_refined.common.network.messages.C2SChangeDesktop; import whocraft.tardis_refined.common.tardis.TardisDesktops; import whocraft.tardis_refined.common.tardis.themes.DesktopTheme; @@ -20,43 +22,35 @@ import whocraft.tardis_refined.constants.ModMessages; import whocraft.tardis_refined.registry.TRSoundRegistry; -import static whocraft.tardis_refined.client.screen.selections.ShellSelectionScreen.NOISE; +import java.util.Collection; +import java.util.Comparator; -public class DesktopSelectionScreen extends SelectionScreen { +public class DesktopSelectionScreen extends MonitorOS { - public static ResourceLocation MONITOR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/desktop.png"); - public static ResourceLocation MONITOR_TEXTURE_OVERLAY = new ResourceLocation(TardisRefined.MODID, "textures/gui/desktop_overlay.png"); public static ResourceLocation previousImage = TardisDesktops.FACTORY_THEME.getPreviewTexture(); - protected int imageWidth = 256; - protected int imageHeight = 173; private DesktopTheme currentDesktopTheme; - private int leftPos, topPos; public DesktopSelectionScreen() { - super(Component.translatable(ModMessages.UI_DESKTOP_SELECTION)); + super(Component.translatable(ModMessages.UI_DESKTOP_CONFIGURATION), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); } public static void selectDesktop(DesktopTheme theme) { + assert Minecraft.getInstance().player != null; new C2SChangeDesktop(Minecraft.getInstance().player.level().dimension(), theme).send(); Minecraft.getInstance().setScreen(null); } @Override protected void init() { - this.setEvents(() -> { - DesktopSelectionScreen.selectDesktop(currentDesktopTheme); - }, () -> { - Minecraft.getInstance().setScreen(null); + super.init(); + this.setEvents(() -> DesktopSelectionScreen.selectDesktop(currentDesktopTheme), () -> { + if (PREVIOUS != null) + this.switchScreenToLeft(PREVIOUS); }); this.currentDesktopTheme = grabDesktop(); - - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; - - addSubmitButton(width / 2 + 90, (height) / 2 + 35); - addCancelButton(width / 2 + 40, (height) / 2 + 35); - - super.init(); + int vPos = (height - monitorHeight) / 2; + addSubmitButton(width / 2 + 25, height - vPos - 25); + addCancelButton(width / 2 + 5, height - vPos - 25); } private DesktopTheme grabDesktop() { @@ -67,74 +61,60 @@ private DesktopTheme grabDesktop() { } @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - this.renderTransparentBackground(guiGraphics); - - PoseStack poseStack = guiGraphics.pose(); + public void renderBackdrop(@NotNull GuiGraphics guiGraphics) { + super.renderBackdrop(guiGraphics); + } - /*Render Back drop*/ - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - guiGraphics.blit(MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); + @Override + public void inMonitorRender(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + PoseStack poseStack = guiGraphics.pose(); + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; /*Render Interior Image*/ RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + guiGraphics.blit(backdrop, 5 + width / 2, -50 + height / 2, 110, monitorHeight, 110, 95); poseStack.pushPose(); - poseStack.translate(width / 2 - 110, height / 2 - 72, 0); - poseStack.scale(0.31333333F, 0.31333333F, 0.313333330F); - + int trim = 15; + poseStack.translate(hPos + trim - 5, vPos + trim + 5, 0); + float scale = (monitorHeight - 2 * trim) / 400.0f; + guiGraphics.blit(backdrop, -5, -5, 0, monitorHeight, 110, 110); + poseStack.scale(scale, scale, scale); guiGraphics.blit(currentDesktopTheme.getPreviewTexture(), 0, 0, 0, 0, 400, 400, 400, 400); double alpha = (100.0D - this.age * 3.0D) / 100.0D; RenderSystem.enableBlend(); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, (float) alpha); - guiGraphics.blit(previousImage, (int) ((Math.random() * 14) - 2), (int) ((Math.random() * 14) - 2), 400, 400, 400, 400); + guiGraphics.blit(previousImage, 0, 0, 400, 400, 400, 400); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, (float) alpha); RenderSystem.setShaderTexture(0, NOISE); - guiGraphics.blit(NOISE, 0, 0, this.noiseX, this.noiseY, 400, 400); + guiGraphics.blit(NOISE, 0, 0, (int) (Math.random() * 736), (int) (414 * (System.currentTimeMillis() % 1000) / 1000.0), 400, 400); RenderSystem.disableBlend(); poseStack.popPose(); - - /*Render Back drop*/ - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - guiGraphics.blit(MONITOR_TEXTURE_OVERLAY, leftPos, topPos, 0, 0, imageWidth, imageHeight); - - super.render(guiGraphics, i, j, f); - - - } - - @Override - public void renderBackground(GuiGraphics guiGraphics, int i, int j, float f) { - } @Override - public Component getSelectedDisplayName() { - return Component.Serializer.fromJson(currentDesktopTheme.getName()); - } - - @Override - public ObjectSelectionList createSelectionList() { - int leftPos = width / 2 + 45; - GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 57, 80, leftPos, this.topPos + 30, this.topPos + this.imageHeight - 60, 12); + public ObjectSelectionList createSelectionList() { + int leftPos = 5 + width / 2; + int topPos = (height - monitorHeight) / 2; + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 100, 80, leftPos, topPos + 15, topPos + monitorHeight - 30, 12); selectionList.setRenderBackground(false); - for (DesktopTheme desktop : TardisDesktops.getRegistry().values()) { + Collection values = TardisDesktops.getRegistry().values(); + values = values.stream().sorted(Comparator.comparing(DesktopTheme::getName)).toList(); + for (DesktopTheme desktop : values) { Component name = Component.literal(MiscHelper.getCleanName(desktop.getIdentifier().getPath())); - // Check for if the tellraw name is incomplete, or fails to pass. try { - var json = Component.Serializer.fromJson(new StringReader(desktop.getName())); - name = json; + name = Component.Serializer.fromJson(new StringReader(desktop.getName())); } catch (Exception ex) { - TardisRefined.LOGGER.error("Could not process Name for datapack desktop " + desktop.getIdentifier().toString()); + TardisRefined.LOGGER.error("Could not process Name for datapack desktop {}", desktop.getIdentifier().toString()); } selectionList.children().add(new SelectionListEntry(name, (entry) -> { @@ -155,5 +135,4 @@ public ObjectSelectionList createSelectionList() { return selectionList; } - } \ No newline at end of file diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/HumSelectionScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/HumSelectionScreen.java similarity index 52% rename from common/src/main/java/whocraft/tardis_refined/client/screen/selections/HumSelectionScreen.java rename to common/src/main/java/whocraft/tardis_refined/client/screen/screens/HumSelectionScreen.java index 299aa8fb9..d747df9b2 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/HumSelectionScreen.java +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/HumSelectionScreen.java @@ -1,110 +1,62 @@ -package whocraft.tardis_refined.client.screen.selections; +package whocraft.tardis_refined.client.screen.screens; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.brigadier.StringReader; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.ObjectSelectionList; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.main.MonitorOS; import whocraft.tardis_refined.common.hum.HumEntry; import whocraft.tardis_refined.common.hum.TardisHums; import whocraft.tardis_refined.common.network.messages.hums.C2SChangeHum; import whocraft.tardis_refined.common.util.MiscHelper; +import whocraft.tardis_refined.constants.ModMessages; import java.util.Collection; import java.util.Comparator; -public class HumSelectionScreen extends SelectionScreen { - public static ResourceLocation MONITOR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor.png"); - protected int imageWidth = 256; - protected int imageHeight = 173; - private HumEntry currentHumEntry; - private int leftPos, topPos; +public class HumSelectionScreen extends MonitorOS { + private HumEntry currentHumEntry; public HumSelectionScreen() { - super(Component.translatable("")); + super(Component.translatable(ModMessages.UI_MONITOR_SELECT_HUM), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); } public static void selectHum(HumEntry theme) { + assert Minecraft.getInstance().player != null; new C2SChangeHum(Minecraft.getInstance().player.level().dimension(), theme).send(); - Minecraft.getInstance().setScreen(null); - } - - @Override - public void addSubmitButton(int x, int y) { - super.addSubmitButton(x, y); - } - - @Override - public boolean isPauseScreen() { - return false; + //Minecraft.getInstance().setScreen(null); } @Override protected void init() { - this.setEvents(() -> { - HumSelectionScreen.selectHum(currentHumEntry); - }, () -> { - Minecraft.getInstance().setScreen(null); + super.init(); + this.setEvents(() -> HumSelectionScreen.selectHum(currentHumEntry), () -> { + if (PREVIOUS != null) + this.switchScreenToLeft(PREVIOUS); }); this.currentHumEntry = grabHum(); - - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; - - //Super method already creates the list, we don't need to create it a second time. - super.init(); - - addSubmitButton(width / 2 + 85, (height) / 2 + 35); - addCancelButton(width / 2 - 105, (height) / 2 + 35); - } - - @Override - public boolean mouseClicked(double d, double e, int i) { - return super.mouseClicked(d, e, i); + int vPos = (height - monitorHeight) / 2; + addSubmitButton(width / 2 + 85, height - vPos - 25); + addCancelButton(width / 2 - 105, height - vPos - 25); } private HumEntry grabHum() { - for (HumEntry humEntry : TardisHums.getRegistry().values()) { + for (HumEntry humEntry : TardisHums.getRegistry().values()) return humEntry; - } - return null; - } - - @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - this.renderTransparentBackground(guiGraphics); - - - /*Render Back drop*/ - RenderSystem.setShader(GameRenderer::getPositionTexShader); - guiGraphics.blit(MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); - - - super.render(guiGraphics, i, j, f); + return null; } @Override - public void renderBackground(GuiGraphics guiGraphics, int i, int j, float f) { - - } - - @Override - public Component getSelectedDisplayName() { - return Component.Serializer.fromJson(currentHumEntry.getNameComponent()); - } - - @Override - public ObjectSelectionList createSelectionList() { + public ObjectSelectionList createSelectionList() { + int vPos = (height - monitorHeight) / 2; int leftPos = this.width / 2 - 75; - GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 150, 80, leftPos, this.topPos + 30, this.topPos + this.imageHeight - 60, 12); + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 150, 80, leftPos, vPos + 15, vPos + monitorHeight - 30, 12); selectionList.setRenderBackground(false); Collection knownHums = TardisHums.getRegistry().values(); @@ -115,10 +67,9 @@ public ObjectSelectionList createSelectionList() { // Check for if the tellraw name is incomplete, or fails to pass. try { - var json = Component.Serializer.fromJson(new StringReader(humEntry.getNameComponent())); - name = json; + name = Component.Serializer.fromJson(new StringReader(humEntry.getNameComponent())); } catch (Exception ex) { - TardisRefined.LOGGER.error("Could not process Name for hum " + humEntry.getIdentifier().toString()); + TardisRefined.LOGGER.error("Could not process Name for hum {}", humEntry.getIdentifier().toString()); } selectionList.children().add(new SelectionListEntry(name, (entry) -> { diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/screens/ShellSelectionScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/ShellSelectionScreen.java new file mode 100644 index 000000000..13d2bb7a0 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/ShellSelectionScreen.java @@ -0,0 +1,141 @@ +package whocraft.tardis_refined.client.screen.screens; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.brigadier.StringReader; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.core.Holder; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; +import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.common.network.messages.C2SChangeShell; +import whocraft.tardis_refined.common.tardis.TardisDesktops; +import whocraft.tardis_refined.common.tardis.themes.DesktopTheme; +import whocraft.tardis_refined.common.tardis.themes.ShellTheme; +import whocraft.tardis_refined.constants.ModMessages; +import whocraft.tardis_refined.patterns.ShellPatterns; + +import java.util.Collection; +import java.util.Comparator; + +public class ShellSelectionScreen extends MonitorOS.MonitorOSExtension { + + private Button patternButton; + + public ShellSelectionScreen(ResourceLocation currentShellTheme) { + super(Component.translatable(ModMessages.UI_SHELL_SELECTION), currentShellTheme); + } + + @Override + protected void init() { + super.init(); + this.setEvents( + () -> selectShell(CURRENTSHELLTHEME), + () -> { + //selectShell(CURRENTSHELLTHEME); + if (PREVIOUS != null) + this.switchScreenToLeft(PREVIOUS); + } + ); + + int vPos = (height - monitorHeight) / 2; + + addSubmitButton(width / 2 + 90, height - vPos - 25); + addCancelButton(width / 2 - 11, height - vPos - 25); + + patternButton = addRenderableWidget(Button.builder(Component.literal(""), button -> { + PATTERN = ShellPatterns.next(PATTERNCOLLECTION, PATTERN); + button.setMessage(Component.Serializer.fromJson(new StringReader(PATTERN.name()))); + }).pos(width / 2 + 14, height - vPos - 25).size(70, 20).build()); + boolean themeHasPatterns = PATTERNCOLLECTION.size() > 1; + patternButton.visible = themeHasPatterns; + if (themeHasPatterns) //Update the button name now that we have confirmed that there is more than one pattern in the shell + this.patternButton.setMessage(Component.Serializer.fromJson(new StringReader(PATTERN.name()))); + } + + @Override + public void renderBackdrop(@NotNull GuiGraphics guiGraphics) { + super.renderBackdrop(guiGraphics); + + PoseStack poseStack = guiGraphics.pose(); + + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + poseStack.pushPose(); + + int b = height - vPos, r = width - hPos; + int l1 = hPos + monitorWidth / 4, l2 = hPos + monitorWidth / 2; + + guiGraphics.fill(l2, vPos, r, b, -1072689136); + + poseStack.mulPose(Axis.ZP.rotationDegrees(-90)); + poseStack.translate(-height, 0, 0); + guiGraphics.fillGradient(vPos, l1, b, l2, 0x00000000, -1072689136); + poseStack.popPose(); + } + + @Override + public void inMonitorRender(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + renderShell(guiGraphics, width / 2 - 70, height / 2 - 5, 25F); + } + + @Override + public GenericMonitorSelectionList createSelectionList() { + int leftPos = width / 2; + int topPos = (height - monitorHeight) / 2; + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 105, 80, leftPos, topPos + 15, topPos + monitorHeight - 30, 12); + selectionList.setRenderBackground(false); + + Collection values = ShellTheme.SHELL_THEME_REGISTRY.stream().toList(); + values = values.stream() + .sorted(Comparator.comparing(theme -> theme.getDisplayName().toString())) + .toList(); + + for (ShellTheme shellTheme : values) { + ResourceLocation shellThemeId = ShellTheme.getKey(shellTheme); + + SelectionListEntry selectionListEntry = new SelectionListEntry(shellTheme.getDisplayName(), (entry) -> { + CURRENTSHELLTHEME = shellThemeId; + + for (Object child : selectionList.children()) { + if (child instanceof SelectionListEntry current) { + current.setChecked(false); + } + } + PATTERNCOLLECTION = ShellPatterns.getPatternCollectionForTheme(CURRENTSHELLTHEME); + PATTERN = PATTERNCOLLECTION.get(0); + + boolean themeHasPatterns = PATTERNCOLLECTION.size() > 1; + + //Hide the pattern button if there is only one pattern available for the shell, else show it. (i.e. The default) + patternButton.visible = themeHasPatterns; + + if (themeHasPatterns) //Update the button name now that we have confirmed that there is more than one pattern in the shell + this.patternButton.setMessage(Component.Serializer.fromJson(new StringReader(PATTERN.name()))); + + entry.setChecked(true); + }, leftPos); + + if (CURRENTSHELLTHEME.toString().equals(shellThemeId.toString())) { + selectionListEntry.setChecked(true); + } + + selectionList.children().add(selectionListEntry); + } + + return selectionList; + } + + public void selectShell(ResourceLocation themeId) { + assert Minecraft.getInstance().player != null; + new C2SChangeShell(Minecraft.getInstance().player.level().dimension(), themeId, PATTERN).send(); + //Minecraft.getInstance().setScreen(null); + } + +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/screens/VortexSelectionScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/VortexSelectionScreen.java new file mode 100644 index 000000000..e336aafca --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/VortexSelectionScreen.java @@ -0,0 +1,115 @@ +package whocraft.tardis_refined.client.screen.screens; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.Holder; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import whocraft.tardis_refined.client.renderer.vortex.VortexRenderer; +import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; +import whocraft.tardis_refined.client.screen.components.SelectionListEntry; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.common.VortexRegistry; +import whocraft.tardis_refined.common.network.messages.C2SChangeVortex; +import whocraft.tardis_refined.common.tardis.themes.ShellTheme; +import whocraft.tardis_refined.constants.ModMessages; + +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +public class VortexSelectionScreen extends MonitorOS { + + private final List vortexList; + + public VortexSelectionScreen(ResourceLocation currentVortex) { + super(Component.translatable(ModMessages.UI_MONITOR_VORTEX), null); + this.vortexList = VortexRegistry.VORTEX_REGISTRY.keySet().stream().toList(); + VortexSelectionScreen.currentVortex = currentVortex; + } + + @Override + protected void init() { + super.init(); + this.setEvents(() -> selectVortex(currentVortex), () -> { + //selectVortex(currentVortex); + if (PREVIOUS != null) + this.switchScreenToLeft(PREVIOUS); + }); + if (currentVortex == null) + currentVortex = this.vortexList.get(0); + int vPos = (height - monitorHeight) / 2; + addSubmitButton(width / 2 + 90, height - vPos - 25); + addCancelButton(width / 2 - 11, height - vPos - 25); + } + + public void selectVortex(ResourceLocation themeId) { + assert Minecraft.getInstance().player != null; + new C2SChangeVortex(Minecraft.getInstance().player.level().dimension(), themeId).send(); + //Minecraft.getInstance().setScreen(null); + } + + @Override + public void renderBackdrop(@NotNull GuiGraphics guiGraphics) { + super.renderBackdrop(guiGraphics); + + PoseStack poseStack = guiGraphics.pose(); + + int hPos = (width - monitorWidth) / 2; + int vPos = (height - monitorHeight) / 2; + + poseStack.pushPose(); + + int b = height - vPos, r = width - hPos; + int l1 = hPos + monitorWidth / 4, l2 = hPos + monitorWidth / 2; + + guiGraphics.fill(l2, vPos, r, b, -1072689136); + + poseStack.mulPose(Axis.ZP.rotationDegrees(-90)); + poseStack.translate(-height, 0, 0); + guiGraphics.fillGradient(vPos, l1, b, l2, 0x00000000, -1072689136); + poseStack.popPose(); + } + + @Override + public GenericMonitorSelectionList createSelectionList() { + int leftPos = width / 2; + int topPos = (height - monitorHeight) / 2; + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 105, 80, leftPos, topPos + 15, topPos + monitorHeight - 30, 12); + + selectionList.setRenderBackground(false); + + Collection values = VortexRegistry.VORTEX_REGISTRY.stream().toList(); + values = values.stream() + .sorted(Comparator.comparing(theme -> theme.getDisplayName().toString())) + .toList(); + + for (VortexRegistry vort : values) { + ResourceLocation vortId = VortexRegistry.VORTEX_REGISTRY.getKey(vort); + + SelectionListEntry selectionListEntry = new SelectionListEntry(vort.getDisplayName(), (entry) -> { + currentVortex = vortId; + + for (Object child : selectionList.children()) { + if (child instanceof SelectionListEntry current) { + current.setChecked(false); + } + } + + entry.setChecked(true); + }, leftPos); + + + if (currentVortex.toString().equals(vortId.toString())) { + selectionListEntry.setChecked(true); + } + + selectionList.children().add(selectionListEntry); + } + + return selectionList; + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/waypoints/WaypointListScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/WaypointListScreen.java similarity index 65% rename from common/src/main/java/whocraft/tardis_refined/client/screen/waypoints/WaypointListScreen.java rename to common/src/main/java/whocraft/tardis_refined/client/screen/screens/WaypointListScreen.java index 3edb07402..ebd30429a 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/waypoints/WaypointListScreen.java +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/WaypointListScreen.java @@ -1,4 +1,4 @@ -package whocraft.tardis_refined.client.screen.waypoints; +package whocraft.tardis_refined.client.screen.screens; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -6,83 +6,67 @@ import net.minecraft.client.gui.components.Tooltip; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.client.screen.ScreenHelper; import whocraft.tardis_refined.client.screen.components.CommonTRWidgets; import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; import whocraft.tardis_refined.client.screen.components.SelectionListEntry; -import whocraft.tardis_refined.client.screen.selections.SelectionScreen; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.client.screen.waypoints.CoordInputType; import whocraft.tardis_refined.common.network.messages.waypoints.C2SOpenCoordinatesDisplayMessage; import whocraft.tardis_refined.common.network.messages.waypoints.C2SOpenEditCoordinatesDisplayMessage; import whocraft.tardis_refined.common.network.messages.waypoints.C2SRemoveWaypointEntry; import whocraft.tardis_refined.common.network.messages.waypoints.C2STravelToWaypoint; +import whocraft.tardis_refined.common.tardis.TardisDesktops; import whocraft.tardis_refined.common.tardis.TardisWaypoint; +import whocraft.tardis_refined.common.tardis.themes.DesktopTheme; import whocraft.tardis_refined.constants.ModMessages; import java.awt.*; -import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; -public class WaypointListScreen extends SelectionScreen { +public class WaypointListScreen extends MonitorOS { public static final ResourceLocation TRASH_LOCATION = new ResourceLocation(TardisRefined.MODID, "trash"); public static final ResourceLocation OKAY_TEXTURE = new ResourceLocation(TardisRefined.MODID, "okay"); public static final ResourceLocation EDIT_TEXTURE = new ResourceLocation(TardisRefined.MODID, "edit"); - public static ResourceLocation MONITOR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor.png"); private final Component noWaypointsLabel = Component.translatable(ModMessages.UI_MONITOR_NO_WAYPOINTS); - protected int imageWidth = 256; - protected int imageHeight = 173; - private int leftPos, topPos; private SpriteIconButton loadButton; private SpriteIconButton editButton; private SpriteIconButton trashButton; - private Collection WAYPOINTS = new ArrayList<>(); + private final Collection WAYPOINTS; private TardisWaypoint waypoint = null; public WaypointListScreen(Collection waypoints) { - super(Component.translatable(ModMessages.UI_MONITOR_MAIN_TITLE)); + super(Component.translatable(ModMessages.UI_MONITOR_MAIN_TITLE), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); this.WAYPOINTS = waypoints; } - - @Override - public boolean isPauseScreen() { - return false; - } - - @Override protected void init() { - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; - - //Super method already creates the list, we don't need to create it a second time. super.init(); setEvents(() -> { - if (waypoint != null) { + if (waypoint != null) new C2STravelToWaypoint(waypoint.getId()).send(); - Minecraft.getInstance().setScreen(null); - } - Minecraft.getInstance().setScreen(null); - }, new SelectionScreenRun() { - @Override - public void onPress() { - if (waypoint != null) { - new C2SRemoveWaypointEntry(waypoint.getId()).send(); - } - } + }, () -> { + if (waypoint != null) + new C2SRemoveWaypointEntry(waypoint.getId()).send(); + this.switchScreenToLeft(PREVIOUS); + }); - SpriteIconButton newWaypointButton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Submit"), (arg) -> { - new C2SOpenCoordinatesDisplayMessage(CoordInputType.WAYPOINT).send(); - }, true, BUTTON_LOCATION)); + SpriteIconButton newWaypointButton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Submit"), (arg) -> new C2SOpenCoordinatesDisplayMessage(CoordInputType.WAYPOINT).send(), true, BUTTON_LOCATION)); newWaypointButton.setTooltip(Tooltip.create(Component.translatable(ModMessages.UI_MONITOR_WAYPOINT_CREATE))); newWaypointButton.setPosition(width / 2 + 85, (height) / 2 - 60); + int vPos = (height - monitorHeight) / 2; + addCancelButton(width / 2 - 105, height - vPos - 25); this.loadButton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Submit"), (arg) -> { if (waypoint != null) { @@ -108,24 +92,24 @@ public void onPress() { this.editButton.active = false; - this.trashButton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Submit"), (arg) -> { - new C2SRemoveWaypointEntry(waypoint.getId()).send(); - - }, true, TRASH_LOCATION)); + this.trashButton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Submit"), (arg) -> new C2SRemoveWaypointEntry(waypoint.getId()).send(), true, TRASH_LOCATION)); this.trashButton.setPosition(width / 2 + 85, (height) / 2 - 20); this.trashButton.setTooltip(Tooltip.create(Component.translatable(ModMessages.UI_MONITOR_WAYPOINT_DELETE))); this.trashButton.active = false; } - @Override - public GenericMonitorSelectionList createSelectionList() { - int leftPos = this.width / 2 - 100; - GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 250, 80, leftPos - 70, this.topPos + 45, this.topPos + this.imageHeight - 45, 12); + public GenericMonitorSelectionList createSelectionList() { + int vPos = (height - monitorHeight) / 2; + int leftPos = this.width / 2 - 75; + GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 150, 80, leftPos, vPos + 15, vPos + monitorHeight - 30, 12); selectionList.setRenderBackground(false); - for (TardisWaypoint waypointEntry : WAYPOINTS) { + Collection values = WAYPOINTS; + values = values.stream().sorted(Comparator.comparing(TardisWaypoint::getName)).toList(); + + for (TardisWaypoint waypointEntry : values) { selectionList.children().add(new SelectionListEntry(Component.literal(waypointEntry.getLocation().getName()), entry -> { entry.setChecked(true); this.waypoint = waypointEntry; @@ -145,29 +129,13 @@ public GenericMonitorSelectionList createSelectionList() { return selectionList; } - - @Override - public void renderBackground(GuiGraphics guiGraphics, int i, int j, float f) { - // super.renderBackground(guiGraphics, i, j, f); - } - @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - + public void inMonitorRender(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { int textOffset = height / 2 - 60; int textScale = 40; - this.renderTransparentBackground(guiGraphics); - - guiGraphics.blit(MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); - - ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_MONITOR_WAYPOINTS).getString(), guiGraphics, Minecraft.getInstance().font, width / 2 - 96, textOffset, Color.LIGHT_GRAY.getRGB(), textScale * 2, 1F, false); - - if (WAYPOINTS.isEmpty()) { - ScreenHelper.renderWidthScaledText(noWaypointsLabel.getString(), guiGraphics, Minecraft.getInstance().font, width / 2 - 96, textOffset + 15, Color.LIGHT_GRAY.getRGB(), textScale * 2, 1F, false); - } - - super.render(guiGraphics, i, j, f); + if (WAYPOINTS.isEmpty()) + ScreenHelper.renderWidthScaledText(noWaypointsLabel.getString(), guiGraphics, Minecraft.getInstance().font, width / 2f - 96, textOffset + 15, Color.LIGHT_GRAY.getRGB(), textScale * 2, 1F, false); } } diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/waypoints/WaypointManageScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/WaypointManageScreen.java similarity index 70% rename from common/src/main/java/whocraft/tardis_refined/client/screen/waypoints/WaypointManageScreen.java rename to common/src/main/java/whocraft/tardis_refined/client/screen/screens/WaypointManageScreen.java index d40cb773a..d7cc44e23 100644 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/waypoints/WaypointManageScreen.java +++ b/common/src/main/java/whocraft/tardis_refined/client/screen/screens/WaypointManageScreen.java @@ -1,17 +1,19 @@ -package whocraft.tardis_refined.client.screen.waypoints; +package whocraft.tardis_refined.client.screen.screens; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.SpriteIconButton; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.client.screen.ScreenHelper; import whocraft.tardis_refined.client.screen.components.CommonTRWidgets; +import whocraft.tardis_refined.client.screen.main.MonitorOS; +import whocraft.tardis_refined.client.screen.waypoints.CoordInputType; import whocraft.tardis_refined.common.network.messages.waypoints.C2SEditWaypoint; import whocraft.tardis_refined.common.network.messages.waypoints.C2SRequestWaypoints; import whocraft.tardis_refined.common.network.messages.waypoints.C2SUploadWaypoint; @@ -23,56 +25,48 @@ import java.awt.*; import java.util.List; -import static whocraft.tardis_refined.client.screen.selections.SelectionScreen.BUTTON_LOCATION; +public class WaypointManageScreen extends MonitorOS { -public class WaypointManageScreen extends Screen { - - public static ResourceLocation MONITOR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor.png"); private final CoordInputType coordInputType; - protected int imageWidth = 256; - protected int imageHeight = 173; protected EditBox waypointName; - private int leftPos, topPos; private TardisWaypoint preExistingWaypoint = null; - private TardisNavLocation tardisNavLocation = TardisNavLocation.ORIGIN; + private final TardisNavLocation tardisNavLocation; private SpriteIconButton onSaveWaypoint; - - public WaypointManageScreen(List> worlds, CoordInputType coordInputType, TardisNavLocation tardisNavLocation) { - super(Component.translatable(coordInputType == CoordInputType.WAYPOINT ? ModMessages.UI_MONITOR_UPLOAD_WAYPOINTS : ModMessages.UI_MONITOR_UPLOAD_COORDS)); + public WaypointManageScreen(List> ignoredWorlds, CoordInputType coordInputType, TardisNavLocation tardisNavLocation) { + super(Component.translatable(coordInputType == CoordInputType.WAYPOINT ? ModMessages.UI_MONITOR_UPLOAD_WAYPOINTS : ModMessages.UI_MONITOR_UPLOAD_COORDS), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); this.coordInputType = coordInputType; this.tardisNavLocation = tardisNavLocation; tardisNavLocation.setName("Waypoint"); } public WaypointManageScreen(TardisWaypoint waypoint) { - super(Component.translatable("Edit waypoint")); + super(Component.translatable("Edit waypoint"), new ResourceLocation(TardisRefined.MODID, "textures/gui/monitor/backdrop.png")); this.preExistingWaypoint = waypoint; this.tardisNavLocation = waypoint.getLocation(); this.coordInputType = CoordInputType.WAYPOINT; + + this.setEvents(() -> { + + }, () -> { + new C2SRequestWaypoints().send(); + }); + } @Override protected void init() { super.init(); - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; - - int yPosition = 30; // Move yPosition to the top of the screen - int xPosition = this.width / 2 + 15; - int widgetHeight = 20; - - int waypointNameWidth = this.width / 2 - 70; + int waypointNameWidth = monitorWidth / 2; int waypointNameHeight = this.height / 2; - + int yPosition = height / 2; + int xPosition = this.width / 2 - (waypointNameWidth / 2); yPosition += 30; - xPosition = this.width / 2 - (waypointNameWidth / 2); - - onSaveWaypoint = this.addRenderableWidget(CommonTRWidgets.imageButton(waypointNameWidth, Component.translatable(ModMessages.UI_MONITOR_WAYPOINT_SUBMIT), (arg) -> { + onSaveWaypoint = this.addRenderableWidget(CommonTRWidgets.imageButton(waypointNameWidth, Component.translatable(ModMessages.SUBMIT), (arg) -> { if (preExistingWaypoint != null) { tardisNavLocation.setName(this.waypointName.getValue()); @@ -86,8 +80,7 @@ protected void init() { }, false, BUTTON_LOCATION)); - - onSaveWaypoint.setPosition(xPosition, yPosition + 100); + onSaveWaypoint.setPosition(xPosition, yPosition); addWidget(onSaveWaypoint); if (coordInputType == CoordInputType.WAYPOINT) { @@ -107,28 +100,23 @@ protected void init() { }); // Waypoint Stuff this.addWidget(waypointName); + + int vPos = (height - monitorHeight) / 2; + addCancelButton(width / 2 - 105, height - vPos - 25); + } } @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - this.renderTransparentBackground(guiGraphics); - super.render(guiGraphics, i, j, f); - guiGraphics.blit(MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); + public void inMonitorRender(@NotNull GuiGraphics guiGraphics, int i, int j, float f) { - if (coordInputType == CoordInputType.WAYPOINT) { + if (coordInputType == CoordInputType.WAYPOINT) this.waypointName.render(guiGraphics, i, j, f); - } - - if (waypointName.getValue().isEmpty()) { - onSaveWaypoint.active = false; - } else { - onSaveWaypoint.active = true; - } + onSaveWaypoint.active = !waypointName.getValue().isEmpty(); - int headerHeight = height / 2 - imageHeight / 3; - int starterCordHeight = height / 2 - imageHeight / 3 + 7; + int headerHeight = height / 2 - monitorHeight / 3; + int starterCordHeight = height / 2 - monitorHeight / 3 + 7; int centerX = width / 2; String baseDirection = tardisNavLocation.getDirection().getName(); @@ -136,17 +124,14 @@ public void render(GuiGraphics guiGraphics, int i, int j, float f) { String dimensionName = MiscHelper.getCleanDimensionName(tardisNavLocation.getDimensionKey()); - ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_WAYPOINT_NEW_WAYPOINT).getString(), guiGraphics, Minecraft.getInstance().font, centerX, headerHeight, Color.LIGHT_GRAY.getRGB(), 80, 1F, true); - if (preExistingWaypoint == null) { + if (preExistingWaypoint == null) ScreenHelper.renderWidthScaledText(Component.translatable(ModMessages.UI_WAYPOINT_TAKEN).getString(), guiGraphics, Minecraft.getInstance().font, centerX, headerHeight + 10, Color.LIGHT_GRAY.getRGB(), 80, 1F, true); - } ScreenHelper.renderWidthScaledText(tardisNavLocation.getPosition().toShortString(), guiGraphics, Minecraft.getInstance().font, centerX, starterCordHeight + 15, Color.white.getRGB(), 80, 1F, true); ScreenHelper.renderWidthScaledText(direction + ", " + dimensionName, guiGraphics, Minecraft.getInstance().font, centerX, starterCordHeight + 25, Color.white.getRGB(), 100, 1F, true); - } @Override @@ -159,14 +144,4 @@ public boolean charTyped(char c, int i) { return super.charTyped(c, i); } - @Override - public void renderBackground(GuiGraphics guiGraphics, int i, int j, float f) { - - } - - @Override - public boolean isPauseScreen() { - return false; - } - } diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/SelectionScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/selections/SelectionScreen.java deleted file mode 100644 index 23aba83ee..000000000 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/SelectionScreen.java +++ /dev/null @@ -1,101 +0,0 @@ -package whocraft.tardis_refined.client.screen.selections; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.ObjectSelectionList; -import net.minecraft.client.gui.components.SpriteIconButton; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import whocraft.tardis_refined.TardisRefined; -import whocraft.tardis_refined.client.screen.ScreenHelper; -import whocraft.tardis_refined.client.screen.components.CommonTRWidgets; -import whocraft.tardis_refined.constants.ModMessages; - -import java.awt.*; - -public class SelectionScreen extends Screen { - - public static final ResourceLocation BUTTON_LOCATION = new ResourceLocation(TardisRefined.MODID, "save"); - public static final ResourceLocation BCK_LOCATION = new ResourceLocation(TardisRefined.MODID, "back"); - private final Component title; - public int noiseX, noiseY, age; - public double noiseAlpha; - private SelectionScreenRun onSubmit; - private SelectionScreenRun onCancel; - private ObjectSelectionList list; - - - public SelectionScreen(Component title) { - super(Component.translatable(ModMessages.UI_SHELL_SELECTION)); - this.title = title; - } - - public void setEvents(SelectionScreenRun onSubmit, SelectionScreenRun onCancel) { - this.onSubmit = onSubmit; - this.onCancel = onCancel; - } - - @Override - protected void init() { - super.init(); - list = createSelectionList(); - this.addRenderableWidget(list); - - } - - - public void addSubmitButton(int x, int y) { - if (onSubmit != null) { - SpriteIconButton spriteiconbutton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Submit"), (arg) -> { - this.onSubmit.onPress(); - }, true, BUTTON_LOCATION)); - spriteiconbutton.setPosition(x, y); - } - } - - public void addCancelButton(int x, int y) { - if (onCancel != null) { - SpriteIconButton spriteiconbutton = this.addRenderableWidget(CommonTRWidgets.imageButton(20, Component.translatable("Cancel"), (arg) -> { - this.onCancel.onPress(); - }, true, BCK_LOCATION)); - spriteiconbutton.setPosition(x, y); - } - - } - - public ObjectSelectionList createSelectionList() { - return null; - } - - public Component getSelectedDisplayName() { - return null; - } - - - @Override - public boolean isPauseScreen() { - return false; - } - - @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - super.render(guiGraphics, i, j, f); - ScreenHelper.renderWidthScaledText(title.getString(), guiGraphics, Minecraft.getInstance().font, width / 2, height / 2 - 100, Color.LIGHT_GRAY.getRGB(), 300, true); - } - - @Override - public void tick() { - RandomSource random = Minecraft.getInstance().level.random; - super.tick(); - this.age++; - this.noiseX = random.nextInt(736); - this.noiseY = random.nextInt(414); - if (this.age % 3 == 0) this.noiseAlpha = random.nextDouble(); - } - - public interface SelectionScreenRun { - void onPress(); - } -} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/ShellSelectionScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/selections/ShellSelectionScreen.java deleted file mode 100644 index a12dde41b..000000000 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/ShellSelectionScreen.java +++ /dev/null @@ -1,268 +0,0 @@ -package whocraft.tardis_refined.client.screen.selections; - -import com.mojang.blaze3d.platform.Lighting; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.blaze3d.vertex.VertexSorting; -import com.mojang.brigadier.StringReader; -import com.mojang.math.Axis; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.Registries; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.Level; -import org.joml.Matrix4f; -import whocraft.tardis_refined.TardisRefined; -import whocraft.tardis_refined.client.TardisClientData; -import whocraft.tardis_refined.client.model.blockentity.shell.ShellModel; -import whocraft.tardis_refined.client.model.blockentity.shell.ShellModelCollection; -import whocraft.tardis_refined.client.overlays.VortexOverlay; -import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; -import whocraft.tardis_refined.client.screen.components.SelectionListEntry; -import whocraft.tardis_refined.common.blockentity.shell.GlobalShellBlockEntity; -import whocraft.tardis_refined.common.network.messages.C2SChangeShell; -import whocraft.tardis_refined.common.tardis.themes.ShellTheme; -import whocraft.tardis_refined.constants.ModMessages; -import whocraft.tardis_refined.patterns.ShellPattern; -import whocraft.tardis_refined.patterns.ShellPatterns; -import whocraft.tardis_refined.registry.TRBlockRegistry; - -import java.util.List; -import java.util.UUID; - -public class ShellSelectionScreen extends SelectionScreen { - - public static ResourceLocation MONITOR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/shell.png"); - public static ResourceLocation NOISE = new ResourceLocation(TardisRefined.MODID, "textures/gui/noise.png"); - public static GlobalShellBlockEntity globalShellBlockEntity; - private final List themeList; - protected int imageWidth = 256; - protected int imageHeight = 173; - private ResourceLocation currentShellTheme; - private int leftPos, topPos; - private ShellPattern pattern; - private List patternCollection; - private Button patternButton; - - public ShellSelectionScreen(ResourceLocation currentShellTheme) { - super(Component.translatable(ModMessages.UI_SHELL_SELECTION)); - this.themeList = ShellTheme.SHELL_THEME_REGISTRY.keySet().stream().toList(); - generateDummyGlobalShell(); - this.currentShellTheme = currentShellTheme; - - } - - public static void generateDummyGlobalShell() { - globalShellBlockEntity = new GlobalShellBlockEntity(BlockPos.ZERO, TRBlockRegistry.GLOBAL_SHELL_BLOCK.get().defaultBlockState()); - assert Minecraft.getInstance().level != null; - globalShellBlockEntity.setLevel(Minecraft.getInstance().level); - ResourceKey generatedLevelKey = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(TardisRefined.MODID, UUID.randomUUID().toString())); - globalShellBlockEntity.setTardisId(generatedLevelKey); - globalShellBlockEntity.setShellTheme(ShellTheme.POLICE_BOX.getId()); - globalShellBlockEntity.setPattern(ShellPatterns.DEFAULT); - } - - @Override - public void tick() { - super.tick(); - } - - @Override - protected void init() { - this.setEvents(() -> { - selectShell(this.currentShellTheme); - }, () -> { - Minecraft.getInstance().setScreen(null); - }); - if (currentShellTheme == null) { - this.currentShellTheme = this.themeList.get(0); - } - this.patternCollection = ShellPatterns.getPatternCollectionForTheme(this.currentShellTheme); - this.pattern = this.patternCollection.get(0); - - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; - - addSubmitButton(width / 2 + 90, (height) / 2 + 34); - addCancelButton(width / 2 - 11, (height) / 2 + 34); - - patternButton = addRenderableWidget(Button.builder(Component.literal(""), button -> { - pattern = ShellPatterns.next(this.patternCollection, this.pattern); - button.setMessage(Component.Serializer.fromJson(new StringReader(this.pattern.name()))); - }).pos(width / 2 + 14, (height) / 2 + 34).size(70, 20).build()); - - patternButton.visible = false; //Hide when initialised. We will only show it when there are more than 1 pattern for a shell (via its {@link PatternCollection} ) - - super.init(); - } - - public void selectShell(ResourceLocation themeId) { - new C2SChangeShell(Minecraft.getInstance().player.level().dimension(), themeId, pattern).send(); - Minecraft.getInstance().setScreen(null); - } - - - @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - PoseStack poseStack = guiGraphics.pose(); - Minecraft mc = Minecraft.getInstance(); - ClientLevel lvl = mc.level; - assert lvl != null; - RandomSource rand = lvl.random; - - boolean isCrashed = TardisClientData.getInstance(lvl.dimension()).isCrashing(); - - if (isCrashed) { - if (rand.nextInt(10) == 1) { - for (int i1 = 0; i1 < 3; i1++) { - poseStack.translate(rand.nextInt(3) / 100F, rand.nextInt(3) / 100.0f, rand.nextInt(3) / 100.0f); - } - } - if (rand.nextInt(20) == 1) { - poseStack.scale(1, 1 + rand.nextInt(5) / 100F, 1); - } - } - - - guiGraphics.enableScissor(leftPos + 3, topPos + 3, width - leftPos - 3, height - topPos - 3); - RenderSystem.backupProjectionMatrix(); - Matrix4f perspective = new Matrix4f(); - perspective.perspective((float) Math.toRadians(mc.options.fov().get()), (float) width / (float) height, 0.01f, 9999, false, perspective); - perspective.translate(0, 0, 11000f); - RenderSystem.setProjectionMatrix(perspective, VertexSorting.DISTANCE_TO_ORIGIN); - poseStack.pushPose(); - poseStack.mulPose(Axis.YP.rotationDegrees(20)); - VortexOverlay.VORTEX.time.speed = 0.3; - VortexOverlay.VORTEX.renderVortex(guiGraphics, 1, false); - RenderSystem.restoreProjectionMatrix(); - poseStack.popPose(); - guiGraphics.disableScissor(); - - guiGraphics.enableScissor(0, 0, width + 3, topPos + 3); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - guiGraphics.enableScissor(0, topPos + 3, leftPos + 3, height - topPos - 3); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - guiGraphics.enableScissor(width - leftPos - 3, topPos + 3, width, height - topPos - 3); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - guiGraphics.enableScissor(0, height - topPos - 3, width, height); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - - poseStack.pushPose(); - int c = -1072689136; - int l = leftPos + 3, t = topPos + 3, b = height - t, r = width - l; - int l1 = leftPos + imageWidth / 4, l2 = leftPos + imageWidth / 2; - - guiGraphics.fill(l, t, r, b, 0x40000000); - guiGraphics.fill(l2, t, r, b, -1072689136); - - poseStack.mulPose(Axis.ZP.rotationDegrees(-90)); - poseStack.translate(-height, 0, 0); - guiGraphics.fillGradient(t, l1, b, l2, 0x00000000, -1072689136); - poseStack.popPose(); - - /*Render Back drop*/ - //RenderSystem.setShader(GameRenderer::getPositionTexShader); //REDUNDANT - //RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - guiGraphics.blit(MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); - - /*Model*/ - renderShell(guiGraphics, width / 2 - 75, height / 2 - 20, 25F); - //renderShell(guiGraphics, width / 2, height / 2, 25F); - - double alpha = (100.0D - this.age * 3.0D) / 100.0D; - if (isCrashed) { - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, (float) alpha); - guiGraphics.blit(NOISE, leftPos, topPos, this.noiseX, this.noiseY, imageWidth, imageHeight); - RenderSystem.disableBlend(); - } - super.render(guiGraphics, i, j, f); - } - - @Override - public void renderBackground(GuiGraphics guiGraphics, int i, int j, float f) { - // super.renderBackground(guiGraphics, i, j, f); - } - - private void renderShell(GuiGraphics guiGraphics, int x, int y, float scale) { - ShellModel model = ShellModelCollection.getInstance().getShellEntry(this.currentShellTheme).getShellModel(pattern); - model.setDoorPosition(false); - Lighting.setupForEntityInInventory(); - PoseStack pose = guiGraphics.pose(); - pose.pushPose(); - pose.translate((float) x, y, 100.0F); - pose.scale(-scale, scale, scale); - pose.mulPose(Axis.XP.rotationDegrees(-15F)); - pose.mulPose(Axis.YP.rotationDegrees((float) (System.currentTimeMillis() % 5400L) / 15L)); - - VertexConsumer vertexConsumer = guiGraphics.bufferSource().getBuffer(model.renderType(model.getShellTexture(pattern, false))); - model.renderShell(globalShellBlockEntity, false, false, pose, vertexConsumer, 15728880, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); - guiGraphics.flush(); - pose.popPose(); - Lighting.setupFor3DItems(); - } - - - @Override - public Component getSelectedDisplayName() { - ShellTheme theme = ShellTheme.SHELL_THEME_REGISTRY.get(this.currentShellTheme); - return theme.getDisplayName(); - } - - @Override - public GenericMonitorSelectionList createSelectionList() { - int leftPos = width / 2 - 5; - GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 100, 80, leftPos, this.topPos + 30, this.topPos + this.imageHeight - 60, 12); - - selectionList.setRenderBackground(false); - - for (Holder.Reference shellTheme : ShellTheme.SHELL_THEME_REGISTRY.holders().toList()) { - ShellTheme theme = shellTheme.value(); - ResourceLocation shellThemeId = shellTheme.key().location(); - - SelectionListEntry selectionListEntry = new SelectionListEntry(theme.getDisplayName(), (entry) -> { - this.currentShellTheme = shellThemeId; - - for (Object child : selectionList.children()) { - if (child instanceof SelectionListEntry current) { - current.setChecked(false); - } - } - this.patternCollection = ShellPatterns.getPatternCollectionForTheme(this.currentShellTheme); - this.pattern = this.patternCollection.get(0); - - boolean themeHasPatterns = this.patternCollection.size() > 1; - - //Hide the pattern button if there is only one pattern available for the shell, else show it. (i.e. The default) - patternButton.visible = themeHasPatterns; - - if (themeHasPatterns) //Update the button name now that we have confirmed that there is more than one pattern in the shell - this.patternButton.setMessage(Component.Serializer.fromJson(new StringReader(pattern.name()))); - - age = 0; - entry.setChecked(true); - }, leftPos); - - if (currentShellTheme.toString().equals(shellThemeId.toString())) { - selectionListEntry.setChecked(true); - } - - selectionList.children().add(selectionListEntry); - } - - return selectionList; - } -} diff --git a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/VortexSelectionScreen.java b/common/src/main/java/whocraft/tardis_refined/client/screen/selections/VortexSelectionScreen.java deleted file mode 100644 index 55ed7b2b9..000000000 --- a/common/src/main/java/whocraft/tardis_refined/client/screen/selections/VortexSelectionScreen.java +++ /dev/null @@ -1,202 +0,0 @@ -package whocraft.tardis_refined.client.screen.selections; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexSorting; -import com.mojang.math.Axis; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.Holder; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import org.joml.Matrix4f; -import whocraft.tardis_refined.TardisRefined; -import whocraft.tardis_refined.client.TardisClientData; -import whocraft.tardis_refined.client.renderer.vortex.VortexRenderer; -import whocraft.tardis_refined.client.screen.components.GenericMonitorSelectionList; -import whocraft.tardis_refined.client.screen.components.SelectionListEntry; -import whocraft.tardis_refined.common.VortexRegistry; -import whocraft.tardis_refined.common.network.messages.C2SChangeVortex; -import whocraft.tardis_refined.constants.ModMessages; - -import java.util.List; - -public class VortexSelectionScreen extends SelectionScreen { - - public static ResourceLocation MONITOR_TEXTURE = new ResourceLocation(TardisRefined.MODID, "textures/gui/shell.png"); - public static ResourceLocation NOISE = new ResourceLocation(TardisRefined.MODID, "textures/gui/noise.png"); - private final List vortexList; - protected int imageWidth = 256; - protected int imageHeight = 173; - private ResourceLocation currentVortex; - private int leftPos, topPos; - - public static final VortexRenderer VORTEX = new VortexRenderer(VortexRegistry.CLOUDS.get()); - - - public VortexSelectionScreen(ResourceLocation currentShellTheme) { - super(Component.translatable(ModMessages.UI_MONITOR_VORTEX)); - this.vortexList = VortexRegistry.VORTEX_REGISTRY.keySet().stream().toList(); - this.currentVortex = currentShellTheme; - } - - - @Override - public void tick() { - super.tick(); - } - - @Override - protected void init() { - this.setEvents(() -> { - selectVortex(this.currentVortex); - }, () -> { - Minecraft.getInstance().setScreen(null); - }); - if (currentVortex == null) { - this.currentVortex = this.vortexList.get(0); - } - - this.leftPos = (this.width - this.imageWidth) / 2; - this.topPos = (this.height - this.imageHeight) / 2; - - addSubmitButton(width / 2 + 90, (height) / 2 + 34); - addCancelButton(width / 2 - 11, (height) / 2 + 34); - - super.init(); - } - - public void selectVortex(ResourceLocation themeId) { - new C2SChangeVortex(Minecraft.getInstance().player.level().dimension(), themeId).send(); - Minecraft.getInstance().setScreen(null); - } - - - @Override - public void render(GuiGraphics guiGraphics, int i, int j, float f) { - PoseStack poseStack = guiGraphics.pose(); - Minecraft mc = Minecraft.getInstance(); - ClientLevel lvl = mc.level; - assert lvl != null; - RandomSource rand = lvl.random; - - boolean isCrashed = TardisClientData.getInstance(lvl.dimension()).isCrashing(); - - if (isCrashed) { - if (rand.nextInt(10) == 1) { - for (int i1 = 0; i1 < 3; i1++) { - poseStack.translate(rand.nextInt(3) / 100F, rand.nextInt(3) / 100.0f, rand.nextInt(3) / 100.0f); - } - } - if (rand.nextInt(20) == 1) { - poseStack.scale(1, 1 + rand.nextInt(5) / 100F, 1); - } - } - - - guiGraphics.enableScissor(leftPos + 3, topPos + 3, width - leftPos - 3, height - topPos - 3); - RenderSystem.backupProjectionMatrix(); - Matrix4f perspective = new Matrix4f(); - perspective.perspective((float) Math.toRadians(mc.options.fov().get()), (float) width / (float) height, 0.01f, 9999, false, perspective); - perspective.translate(0, 0, 11000f); - RenderSystem.setProjectionMatrix(perspective, VertexSorting.DISTANCE_TO_ORIGIN); - poseStack.pushPose(); - poseStack.mulPose(Axis.YP.rotationDegrees(20)); - VORTEX.time.speed = 0.3; - VORTEX.vortexType = VortexRegistry.VORTEX_DEFERRED_REGISTRY.get(currentVortex); - VORTEX.renderVortex(guiGraphics, 1, false); - RenderSystem.restoreProjectionMatrix(); - poseStack.popPose(); - guiGraphics.disableScissor(); - - guiGraphics.enableScissor(0, 0, width + 3, topPos + 3); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - guiGraphics.enableScissor(0, topPos + 3, leftPos + 3, height - topPos - 3); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - guiGraphics.enableScissor(width - leftPos - 3, topPos + 3, width, height - topPos - 3); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - guiGraphics.enableScissor(0, height - topPos - 3, width, height); - this.renderTransparentBackground(guiGraphics); - guiGraphics.disableScissor(); - - poseStack.pushPose(); - int c = -1072689136; - int l = leftPos + 3, t = topPos + 3, b = height - t, r = width - l; - int l1 = leftPos + imageWidth / 4, l2 = leftPos + imageWidth / 2; - - guiGraphics.fill(l, t, r, b, 0x40000000); - guiGraphics.fill(l2, t, r, b, -1072689136); - - poseStack.mulPose(Axis.ZP.rotationDegrees(-90)); - poseStack.translate(-height, 0, 0); - guiGraphics.fillGradient(t, l1, b, l2, 0x00000000, -1072689136); - poseStack.popPose(); - - /*Render Back drop*/ - //RenderSystem.setShader(GameRenderer::getPositionTexShader); //REDUNDANT - //RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - guiGraphics.blit(MONITOR_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); - - - double alpha = (100.0D - this.age * 3.0D) / 100.0D; - if (isCrashed) { - RenderSystem.enableBlend(); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, (float) alpha); - guiGraphics.blit(NOISE, leftPos, topPos, this.noiseX, this.noiseY, imageWidth, imageHeight); - RenderSystem.disableBlend(); - } - super.render(guiGraphics, i, j, f); - } - - @Override - public void renderBackground(GuiGraphics guiGraphics, int i, int j, float f) { - // super.renderBackground(guiGraphics, i, j, f); - } - - - @Override - public Component getSelectedDisplayName() { - VortexRegistry theme = VortexRegistry.VORTEX_DEFERRED_REGISTRY.get(this.currentVortex); - return theme.getDisplayName(); - } - - @Override - public GenericMonitorSelectionList createSelectionList() { - int leftPos = width / 2 - 5; - GenericMonitorSelectionList selectionList = new GenericMonitorSelectionList<>(this.minecraft, 100, 80, leftPos, this.topPos + 30, this.topPos + this.imageHeight - 60, 12); - - selectionList.setRenderBackground(false); - - for (Holder.Reference shellTheme : VortexRegistry.VORTEX_REGISTRY.holders().toList()) { - VortexRegistry theme = shellTheme.value(); - ResourceLocation shellThemeId = shellTheme.key().location(); - - - SelectionListEntry selectionListEntry = new SelectionListEntry(theme.getDisplayName(), (entry) -> { - this.currentVortex = shellThemeId; - - for (Object child : selectionList.children()) { - if (child instanceof SelectionListEntry current) { - current.setChecked(false); - } - } - - age = 0; - entry.setChecked(true); - }, leftPos); - - if (currentVortex.toString().equals(shellThemeId.toString())) { - selectionListEntry.setChecked(true); - } - - selectionList.children().add(selectionListEntry); - } - - return selectionList; - } -} diff --git a/common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java b/common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java index 0a8f5584f..4d34e4d60 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java +++ b/common/src/main/java/whocraft/tardis_refined/common/block/device/AstralManipulatorBlock.java @@ -2,6 +2,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -23,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import whocraft.tardis_refined.common.blockentity.device.AstralManipulatorBlockEntity; import whocraft.tardis_refined.common.items.ScrewdriverItem; +import whocraft.tardis_refined.common.network.messages.screens.S2COpenCraftingScreen; import whocraft.tardis_refined.common.tardis.CorridorGenerator; @@ -55,34 +57,33 @@ public VoxelShape getShape(BlockState blockState, BlockGetter blockGetter, Block @Override public InteractionResult use(BlockState blockState, Level level, BlockPos blockPos, Player player, InteractionHand interactionHand, BlockHitResult blockHitResult) { + if (!(level instanceof ServerLevel serverLevel) || interactionHand != InteractionHand.MAIN_HAND) { + return super.use(blockState, level, blockPos, player, interactionHand, blockHitResult); + } - if (level instanceof ServerLevel serverLevel && interactionHand == InteractionHand.MAIN_HAND) { - - if (level.getBlockEntity(blockPos) instanceof AstralManipulatorBlockEntity astralManipulatorBlockEntity) { - ItemStack itemStack = player.getItemInHand(interactionHand); - - if (itemStack == ItemStack.EMPTY) { - astralManipulatorBlockEntity.clearDisplay(); - - return InteractionResult.sidedSuccess(false); - } else { - - if (itemStack.getItem() instanceof ScrewdriverItem) { - - astralManipulatorBlockEntity.onRightClick(itemStack, player); - } + if (!(level.getBlockEntity(blockPos) instanceof AstralManipulatorBlockEntity astralManipulatorBlockEntity)) { + return super.use(blockState, level, blockPos, player, interactionHand, blockHitResult); + } - CorridorGenerator.onAttemptToUse(serverLevel, itemStack, blockPos, player); - } + ItemStack itemStack = player.getItemInHand(interactionHand); + if (itemStack.isEmpty()) { + if(player instanceof ServerPlayer serverPlayer) { + new S2COpenCraftingScreen().send(serverPlayer); } + astralManipulatorBlockEntity.clearDisplay(); + return InteractionResult.sidedSuccess(false); + } - + if (itemStack.getItem() instanceof ScrewdriverItem) { + astralManipulatorBlockEntity.onRightClick(itemStack, player); } - return super.use(blockState, level, blockPos, player, interactionHand, blockHitResult); + CorridorGenerator.onAttemptToUse(serverLevel, itemStack, blockPos, player); + return InteractionResult.sidedSuccess(true); } + @Override public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { return new AstralManipulatorBlockEntity(blockPos, blockState); diff --git a/common/src/main/java/whocraft/tardis_refined/common/blockentity/shell/RootedShellBlockEntity.java b/common/src/main/java/whocraft/tardis_refined/common/blockentity/shell/RootedShellBlockEntity.java index d52136327..021debdef 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/blockentity/shell/RootedShellBlockEntity.java +++ b/common/src/main/java/whocraft/tardis_refined/common/blockentity/shell/RootedShellBlockEntity.java @@ -13,12 +13,16 @@ import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.dimension.DimensionHandler; import whocraft.tardis_refined.common.tardis.TardisDesktops; +import whocraft.tardis_refined.common.tardis.TardisNavLocation; +import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.common.tardis.themes.DesktopTheme; import whocraft.tardis_refined.common.util.Platform; import whocraft.tardis_refined.registry.TRBlockEntityRegistry; import java.util.UUID; +import static whocraft.tardis_refined.common.block.shell.ShellBaseBlock.FACING; + public class RootedShellBlockEntity extends ShellBaseBlockEntity { public static boolean setUpOnNextTick = false; // used in fabric MinecraftServer:getAllLevels mixin private boolean runSetUpOnNextTick = false; @@ -74,6 +78,11 @@ private void setUpTardis(BlockState blockState, Level level, BlockPos blockPos) tardisLevelOperator.setupInitialCave(serverLevel, blockState, blockPos); tardisLevelOperator.getProgressionManager().addDiscoveredLevel(level.dimension()); } + TardisPilotingManager pilot = tardisLevelOperator.getPilotingManager(); + + pilot.setTargetLocation(new TardisNavLocation(blockPos, blockState.getValue(FACING), level.dimension())); + pilot.setCurrentLocation(new TardisNavLocation(blockPos, blockState.getValue(FACING), level.dimension())); + //After we setup the data and desktop, open the doors. tardisLevelOperator.setDoorClosed(false); serverLevel.playSound(null, blockPos, SoundEvents.SHEEP_SHEAR, SoundSource.BLOCKS, 1, 1); diff --git a/common/src/main/java/whocraft/tardis_refined/common/capability/player/TardisPlayerInfo.java b/common/src/main/java/whocraft/tardis_refined/common/capability/player/TardisPlayerInfo.java index 9ae896cbf..1625870cd 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/capability/player/TardisPlayerInfo.java +++ b/common/src/main/java/whocraft/tardis_refined/common/capability/player/TardisPlayerInfo.java @@ -5,8 +5,10 @@ import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.RelativeMovement; import net.minecraft.world.entity.player.Abilities; import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; diff --git a/common/src/main/java/whocraft/tardis_refined/common/crafting/astral_manipulator/ManipulatorRecipes.java b/common/src/main/java/whocraft/tardis_refined/common/crafting/astral_manipulator/ManipulatorRecipes.java index a3abda96b..96be72b02 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/crafting/astral_manipulator/ManipulatorRecipes.java +++ b/common/src/main/java/whocraft/tardis_refined/common/crafting/astral_manipulator/ManipulatorRecipes.java @@ -8,6 +8,9 @@ import net.minecraft.world.level.block.piston.PistonBaseBlock; import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import whocraft.tardis_refined.TardisRefined; import whocraft.tardis_refined.registry.TRBlockRegistry; diff --git a/common/src/main/java/whocraft/tardis_refined/common/entity/ControlEntity.java b/common/src/main/java/whocraft/tardis_refined/common/entity/ControlEntity.java index 803abfe24..988da9485 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/entity/ControlEntity.java +++ b/common/src/main/java/whocraft/tardis_refined/common/entity/ControlEntity.java @@ -31,7 +31,6 @@ import whocraft.tardis_refined.common.blockentity.console.GlobalConsoleBlockEntity; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.capability.tardis.upgrades.UpgradeHandler; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.control.ControlSpecification; import whocraft.tardis_refined.common.tardis.control.ship.MonitorControl; import whocraft.tardis_refined.common.tardis.manager.FlightDanceManager; @@ -486,7 +485,7 @@ private boolean handleLeftClick(Player player, ServerLevel serverLevel) { return false; } - Control control = this.controlSpecification.control(); + whocraft.tardis_refined.common.tardis.control.Control control = this.controlSpecification.control(); boolean successfulUse = control.onLeftClick(cap, this.consoleTheme, this, player); ConfiguredSound playedSound = successfulUse ? control.getSuccessSound(cap, this.consoleTheme, true) : control.getFailSound(cap, this.consoleTheme, true); diff --git a/common/src/main/java/whocraft/tardis_refined/common/network/TardisNetwork.java b/common/src/main/java/whocraft/tardis_refined/common/network/TardisNetwork.java index 411d26e6d..b2460553d 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/network/TardisNetwork.java +++ b/common/src/main/java/whocraft/tardis_refined/common/network/TardisNetwork.java @@ -7,6 +7,7 @@ import whocraft.tardis_refined.common.network.messages.player.S2CResetPostShellView; import whocraft.tardis_refined.common.network.messages.player.C2SExitTardisView; import whocraft.tardis_refined.common.network.messages.player.C2SBeginShellView; +import whocraft.tardis_refined.common.network.messages.screens.S2COpenCraftingScreen; import whocraft.tardis_refined.common.network.messages.sync.S2CSyncTardisPlayerView; import whocraft.tardis_refined.common.network.messages.screens.C2SRequestShellSelection; import whocraft.tardis_refined.common.network.messages.screens.S2COpenMonitor; @@ -20,7 +21,7 @@ public class TardisNetwork { public static final NetworkManager NETWORK = NetworkManager.create(new ResourceLocation(TardisRefined.MODID, "channel")); - public static MessageType START_VORTEX_SESSION, END_VORTEX_SESSION, TARDIS_EXIT, OPEN_SHELL_SELECT, SYNC_HUMS, OPEN_WAYPOINTS_DISPLAY, DEL_WAYPOINT, CLIENT_OPEN_COORDS_DISPLAY, SERVER_OPEN_COORDS_DISPLAY, UPGRADE_SCREEN_S2C, + public static MessageType OPEN_CRAFTING_SCREEN, START_VORTEX_SESSION, END_VORTEX_SESSION, TARDIS_EXIT, OPEN_SHELL_SELECT, SYNC_HUMS, OPEN_WAYPOINTS_DISPLAY, DEL_WAYPOINT, CLIENT_OPEN_COORDS_DISPLAY, SERVER_OPEN_COORDS_DISPLAY, UPGRADE_SCREEN_S2C, REQUEST_SHELL_C2S, CLIENT_OPEN_COORDS_SCREEN, SERVER_OPEN_COORDS_SCREEN, CLIENT_OPEN_EDIT_COORDS_SCREEN, SERVER_OPEN_EDIT_COORDS_SCREEN, UPLOAD_WAYPOINT, EDIT_WAYPOINT, SET_WAYPOINT, CHANGE_HUM, REQUEST_WAYPOINTS, SYNC_DESKTOPS, SYNC_CONSOLE_PATTERNS, SYNC_SHELL_PATTERNS, SYNC_LEVELS, INT_REACTION, OPEN_MONITOR, CHANGE_SHELL, CHANGE_DESKTOP, CANCEL_CHANGE_DESKTOP, UNLOCK_UPGRADE, EJECT_PLAYER, TARDIS_PLAYER_INFO, CHANGE_VORTEX; @@ -42,6 +43,7 @@ public static void init() { UPGRADE_SCREEN_S2C = NETWORK.registerS2C("upgrade_screen_s2c", S2CDisplayUpgradeScreen::new); TARDIS_PLAYER_INFO = NETWORK.registerS2C("tardis_player_info", S2CSyncTardisPlayerView::new); END_VORTEX_SESSION = NETWORK.registerS2C("end_vortex_session", S2CResetPostShellView::new); + OPEN_CRAFTING_SCREEN = NETWORK.registerS2C("open_crafting_screen", S2COpenCraftingScreen::new); // C2S Messages CHANGE_SHELL = NETWORK.registerC2S("change_shell", C2SChangeShell::new); diff --git a/common/src/main/java/whocraft/tardis_refined/common/network/messages/C2SChangeShell.java b/common/src/main/java/whocraft/tardis_refined/common/network/messages/C2SChangeShell.java index fe7c4ac2f..b3bcc60a6 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/network/messages/C2SChangeShell.java +++ b/common/src/main/java/whocraft/tardis_refined/common/network/messages/C2SChangeShell.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import whocraft.tardis_refined.api.event.ShellChangeSources; +import whocraft.tardis_refined.client.TardisClientData; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.registry.TRUpgrades; import whocraft.tardis_refined.common.network.MessageC2S; @@ -19,6 +20,7 @@ import whocraft.tardis_refined.patterns.ShellPattern; import whocraft.tardis_refined.patterns.ShellPatterns; +import java.util.Objects; import java.util.Optional; public class C2SChangeShell extends MessageC2S { @@ -54,11 +56,15 @@ public void toBytes(FriendlyByteBuf buf) { @Override public void handle(MessageContext context) { - Optional level = Optional.ofNullable(context.getPlayer().getServer().levels.get(resourceKey)); + Optional level = Optional.ofNullable(Objects.requireNonNull(context.getPlayer().getServer()).levels.get(resourceKey)); level.flatMap(TardisLevelOperator::get).ifPresent(y -> { if (TRUpgrades.CHAMELEON_CIRCUIT_SYSTEM.get().isUnlocked(y.getUpgradeHandler()) && y.getExteriorManager().hasEnoughFuelForShellChange()) { y.setShellTheme(this.shellTheme, pattern.id(), ShellChangeSources.GENERIC_UPDATE); y.getPilotingManager().removeFuel(y.getExteriorManager().getFuelForShellChange()); + TardisClientData clientData = y.tardisClientData(); + clientData.setShellTheme(this.shellTheme); + clientData.setShellPattern(this.pattern.id()); + clientData.sync(); } else { PlayerUtil.sendMessage(context.getPlayer(), ModMessages.HARDWARE_OFFLINE, true); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/network/messages/player/EndPlayerVortexSessionMessage.java b/common/src/main/java/whocraft/tardis_refined/common/network/messages/player/EndPlayerVortexSessionMessage.java deleted file mode 100644 index 32da544ed..000000000 --- a/common/src/main/java/whocraft/tardis_refined/common/network/messages/player/EndPlayerVortexSessionMessage.java +++ /dev/null @@ -1,36 +0,0 @@ -package whocraft.tardis_refined.common.network.messages.player; - -import net.minecraft.network.FriendlyByteBuf; -import org.jetbrains.annotations.NotNull; -import whocraft.tardis_refined.client.TardisClientLogic; -import whocraft.tardis_refined.common.network.MessageContext; -import whocraft.tardis_refined.common.network.MessageS2C; -import whocraft.tardis_refined.common.network.MessageType; -import whocraft.tardis_refined.common.network.TardisNetwork; - -public class EndPlayerVortexSessionMessage extends MessageS2C { - - public EndPlayerVortexSessionMessage() { - } - - public EndPlayerVortexSessionMessage(FriendlyByteBuf friendlyByteBuf) { - } - - - @Override - public @NotNull MessageType getType() { - return TardisNetwork.END_VORTEX_SESSION; - } - - @Override - public void toBytes(FriendlyByteBuf buf) { - - } - - @Override - public void handle(MessageContext context) { - TardisClientLogic.handleClient(); - } - - -} diff --git a/common/src/main/java/whocraft/tardis_refined/common/network/messages/player/StartVortexSessionMessage.java b/common/src/main/java/whocraft/tardis_refined/common/network/messages/player/StartVortexSessionMessage.java deleted file mode 100644 index 7ead5585c..000000000 --- a/common/src/main/java/whocraft/tardis_refined/common/network/messages/player/StartVortexSessionMessage.java +++ /dev/null @@ -1,44 +0,0 @@ -package whocraft.tardis_refined.common.network.messages.player; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; -import whocraft.tardis_refined.common.capability.player.TardisPlayerInfo; -import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; -import whocraft.tardis_refined.common.network.MessageC2S; -import whocraft.tardis_refined.common.network.MessageContext; -import whocraft.tardis_refined.common.network.MessageType; -import whocraft.tardis_refined.common.network.TardisNetwork; - -public class StartVortexSessionMessage extends MessageC2S { - - public StartVortexSessionMessage() { - } - - public StartVortexSessionMessage(FriendlyByteBuf buf) { - } - - - @Override - public @NotNull MessageType getType() { - return TardisNetwork.START_VORTEX_SESSION; - } - - @Override - public void toBytes(FriendlyByteBuf buf) { - - } - - @Override - public void handle(MessageContext context) { - ServerPlayer player = context.getPlayer(); - Level level = context.getPlayer().level(); - if (level instanceof ServerLevel serverLevel) { - TardisLevelOperator.get(serverLevel).ifPresent(tardisLevelOperator -> TardisPlayerInfo.get(context.getPlayer()).ifPresent(tardisInfo -> - tardisInfo.setupPlayerForInspection(player, tardisLevelOperator, tardisLevelOperator.getPilotingManager().isTakingOff() ? tardisLevelOperator.getPilotingManager().getCurrentLocation() : tardisLevelOperator.getPilotingManager().getTargetLocation(), !tardisLevelOperator.getPilotingManager().isTakingOff()) - )); - } - } -} diff --git a/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenCraftingScreen.java b/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenCraftingScreen.java new file mode 100644 index 000000000..37f055f11 --- /dev/null +++ b/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenCraftingScreen.java @@ -0,0 +1,34 @@ +package whocraft.tardis_refined.common.network.messages.screens; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.NotNull; +import whocraft.tardis_refined.client.ScreenHandler; +import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; +import whocraft.tardis_refined.common.network.*; + +public class S2COpenCraftingScreen extends MessageS2C { + + public S2COpenCraftingScreen() { + } + + public S2COpenCraftingScreen(FriendlyByteBuf friendlyByteBuf) { + } + + + @NotNull + @Override + public MessageType getType() { + return TardisNetwork.OPEN_CRAFTING_SCREEN; + } + + @Override + public void toBytes(FriendlyByteBuf buf) { + + } + + @Override + public void handle(MessageContext context) { + ScreenHandler.openCraftingScreen(); + } +} diff --git a/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenMonitor.java b/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenMonitor.java index 2be53341c..204229f69 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenMonitor.java +++ b/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenMonitor.java @@ -4,6 +4,7 @@ import net.fabricmc.api.Environment; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; import whocraft.tardis_refined.client.ScreenHandler; import whocraft.tardis_refined.common.capability.tardis.upgrades.UpgradeHandler; @@ -13,26 +14,32 @@ import whocraft.tardis_refined.common.network.TardisNetwork; import whocraft.tardis_refined.common.tardis.TardisNavLocation; +import java.util.Objects; + public class S2COpenMonitor extends MessageS2C { private final boolean desktopGenerating; - private TardisNavLocation currentLocation, targetLocation; - private CompoundTag upgradeHandlerNbt; + private final TardisNavLocation currentLocation; + private final TardisNavLocation targetLocation; + private final CompoundTag upgradeHandlerNbt; + private final ResourceLocation currentShellTheme; - public S2COpenMonitor(boolean desktopGenerating, TardisNavLocation currentLocation, TardisNavLocation targetLocation, UpgradeHandler upgradeHandler) { + public S2COpenMonitor(boolean desktopGenerating, TardisNavLocation currentLocation, TardisNavLocation targetLocation, UpgradeHandler upgradeHandler, ResourceLocation currentShellTheme) { this.desktopGenerating = desktopGenerating; this.currentLocation = currentLocation; this.targetLocation = targetLocation; this.upgradeHandlerNbt = upgradeHandler.saveData(new CompoundTag()); + this.currentShellTheme = currentShellTheme; } public S2COpenMonitor(FriendlyByteBuf friendlyByteBuf) { this.desktopGenerating = friendlyByteBuf.readBoolean(); - this.currentLocation = TardisNavLocation.deserialize(friendlyByteBuf.readNbt()); - this.targetLocation = TardisNavLocation.deserialize(friendlyByteBuf.readNbt()); + this.currentLocation = TardisNavLocation.deserialize(Objects.requireNonNull(friendlyByteBuf.readNbt())); + this.targetLocation = TardisNavLocation.deserialize(Objects.requireNonNull(friendlyByteBuf.readNbt())); this.upgradeHandlerNbt = friendlyByteBuf.readNbt(); + this.currentShellTheme = friendlyByteBuf.readResourceLocation(); } @NotNull @@ -47,6 +54,7 @@ public void toBytes(FriendlyByteBuf buf) { buf.writeNbt(currentLocation.serialise()); buf.writeNbt(targetLocation.serialise()); buf.writeNbt(upgradeHandlerNbt); + buf.writeResourceLocation(this.currentShellTheme); } @@ -58,7 +66,7 @@ public void handle(MessageContext context) { @Environment(EnvType.CLIENT) private void handleScreens() { // Open the monitor. - ScreenHandler.openMonitorScreen(desktopGenerating, upgradeHandlerNbt, currentLocation, targetLocation); + ScreenHandler.openMonitorScreen(desktopGenerating, upgradeHandlerNbt, currentLocation, targetLocation, currentShellTheme); } } diff --git a/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenShellSelection.java b/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenShellSelection.java index 99e9a7aab..f8d9e5ab2 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenShellSelection.java +++ b/common/src/main/java/whocraft/tardis_refined/common/network/messages/screens/S2COpenShellSelection.java @@ -14,7 +14,7 @@ public class S2COpenShellSelection extends MessageS2C { - private ResourceLocation currentShell; + private final ResourceLocation currentShell; public S2COpenShellSelection(ResourceLocation currentShell) { this.currentShell = currentShell; diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/TardisWaypoint.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/TardisWaypoint.java index 5bb8b6575..6a3c49860 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/TardisWaypoint.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/TardisWaypoint.java @@ -33,6 +33,11 @@ public TardisNavLocation getLocation() { return location; } + public String getName() { + return location.getName(); + } + + public void setLocation(TardisNavLocation location) { this.location = location; } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/CoordinateControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/CoordinateControl.java index 1a6a01d23..149997939 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/CoordinateControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/CoordinateControl.java @@ -7,13 +7,12 @@ import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; import whocraft.tardis_refined.common.tardis.TardisNavLocation; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.common.util.PlayerUtil; -public class CoordinateControl extends Control { +public class CoordinateControl extends whocraft.tardis_refined.common.tardis.control.Control { private CoordinateButton button; diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FastReturnControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FastReturnControl.java index 7ebdbd89b..efa982b39 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FastReturnControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FastReturnControl.java @@ -5,12 +5,11 @@ import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.patterns.sound.ConfiguredSound; -public class FastReturnControl extends Control { +public class FastReturnControl extends whocraft.tardis_refined.common.tardis.control.Control { public FastReturnControl(ResourceLocation id) { super(id); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FuelToggleControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FuelToggleControl.java index c9ab02d42..a2f4108a0 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FuelToggleControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/FuelToggleControl.java @@ -5,14 +5,13 @@ import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.control.ControlSpecification; import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.common.util.PlayerUtil; import whocraft.tardis_refined.constants.ModMessages; -public class FuelToggleControl extends Control { +public class FuelToggleControl extends whocraft.tardis_refined.common.tardis.control.Control { public FuelToggleControl(ResourceLocation id) { super(id); diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/GenericControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/GenericControl.java index 1f13772d4..984a6b365 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/GenericControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/GenericControl.java @@ -4,10 +4,9 @@ import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; -public class GenericControl extends Control { +public class GenericControl extends whocraft.tardis_refined.common.tardis.control.Control { public GenericControl(ResourceLocation id) { super(id); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/HandbrakeControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/HandbrakeControl.java index 6cd51d502..a343e8700 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/HandbrakeControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/HandbrakeControl.java @@ -5,12 +5,11 @@ import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.common.util.PlayerUtil; import whocraft.tardis_refined.constants.ModMessages; -public class HandbrakeControl extends Control { +public class HandbrakeControl extends whocraft.tardis_refined.common.tardis.control.Control { public HandbrakeControl(ResourceLocation id) { super(id, true); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/IncrementControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/IncrementControl.java index 3e7017d8e..bace49163 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/IncrementControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/IncrementControl.java @@ -5,12 +5,11 @@ import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.common.util.PlayerUtil; -public class IncrementControl extends Control { +public class IncrementControl extends whocraft.tardis_refined.common.tardis.control.Control { public IncrementControl(ResourceLocation id) { super(id); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RandomControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RandomControl.java index 043747c31..f6314a2fd 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RandomControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RandomControl.java @@ -6,12 +6,11 @@ import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.common.util.PlayerUtil; -public class RandomControl extends Control { +public class RandomControl extends whocraft.tardis_refined.common.tardis.control.Control { public RandomControl(ResourceLocation id) { super(id); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/ReadoutControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/ReadoutControl.java index 080fde368..9dce3adfc 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/ReadoutControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/ReadoutControl.java @@ -6,12 +6,11 @@ import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; import whocraft.tardis_refined.common.tardis.TardisNavLocation; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.common.util.PlayerUtil; import whocraft.tardis_refined.constants.ModMessages; -public class ReadoutControl extends Control { +public class ReadoutControl extends whocraft.tardis_refined.common.tardis.control.Control { public ReadoutControl(ResourceLocation id) { super(id); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RotationControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RotationControl.java index d1229b2ff..a99c71cf7 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RotationControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/flight/RotationControl.java @@ -6,12 +6,11 @@ import net.minecraft.world.entity.player.Player; import whocraft.tardis_refined.common.capability.tardis.TardisLevelOperator; import whocraft.tardis_refined.common.entity.ControlEntity; -import whocraft.tardis_refined.common.tardis.control.Control; import whocraft.tardis_refined.common.tardis.manager.TardisPilotingManager; import whocraft.tardis_refined.common.tardis.themes.ConsoleTheme; import whocraft.tardis_refined.common.util.PlayerUtil; -public class RotationControl extends Control { +public class RotationControl extends whocraft.tardis_refined.common.tardis.control.Control { public RotationControl(ResourceLocation id) { super(id); } diff --git a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/ship/MonitorControl.java b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/ship/MonitorControl.java index b63b2d99d..159023aa3 100644 --- a/common/src/main/java/whocraft/tardis_refined/common/tardis/control/ship/MonitorControl.java +++ b/common/src/main/java/whocraft/tardis_refined/common/tardis/control/ship/MonitorControl.java @@ -24,6 +24,7 @@ public MonitorControl(ResourceLocation id) { super(id, true); } + public MonitorControl(ResourceLocation id, String langId) { super(id, langId, true); } @@ -56,7 +57,7 @@ public boolean onRightClick(TardisLevelOperator operator, ConsoleTheme theme, Co isSyncingKey = true; } if (!isSyncingKey) - new S2COpenMonitor(operator.getInteriorManager().isWaitingToGenerate(), operator.getPilotingManager().getCurrentLocation(), operator.getPilotingManager().getTargetLocation(), operator.getUpgradeHandler()).send((ServerPlayer) player); + new S2COpenMonitor(operator.getInteriorManager().isWaitingToGenerate(), operator.getPilotingManager().getCurrentLocation(), operator.getPilotingManager().getTargetLocation(), operator.getUpgradeHandler(), operator.getAestheticHandler().getShellTheme()).send((ServerPlayer) player); return true; } return false; diff --git a/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java b/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java index 2cbca550a..e13a55e92 100644 --- a/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java +++ b/common/src/main/java/whocraft/tardis_refined/constants/ModMessages.java @@ -14,7 +14,6 @@ public class ModMessages { public static final String UI_LIST_SELECTION = ui("monitor.list.selection"); public static final String UI_DESKTOP_CONFIGURATION = ui("monitor.desktop"); public static final String UI_SHELL_SELECTION = ui("shell_selection"); - public static final String UI_DESKTOP_SELECTION = ui("desktop_selection"); public static final String UI_MONITOR_GPS = ui("monitor.main.gps"); public static final String UI_MONITOR_VORTEX = ui("monitor.main.vortex"); public static final String UI_MONITOR_DESTINATION = ui("monitor.main.destination"); @@ -32,7 +31,6 @@ public class ModMessages { public static final String UI_MONITOR_WAYPOINT_LOAD = ui("monitor.waypoints.load"); public static final String UI_MONITOR_WAYPOINT_EDIT = ui("monitor.waypoints.edit"); public static final String UI_MONITOR_WAYPOINT_DELETE = ui("monitor.waypoints.delete"); - public static final String UI_MONITOR_WAYPOINT_SUBMIT = ui("monitor.waypoints.submit"); public static final String VANILLA_SELECT_WORLD = "selectWorld.search"; public static final String UI_WAYPOINT_NAME_PLACEHOLDER = "monitor.waypoints.name.placeholder"; public static final String UI_WAYPOINT_NEW_WAYPOINT = "monitor.waypoints.new_waypoint"; @@ -111,6 +109,7 @@ public class ModMessages { public static String CANNOT_START_NO_FUEL = message("cannot_start_no_fuel"); public static String CURRENT = message("current"); public static String DESTINATION = message("destination"); + public static String SUBMIT = message("submit"); public static String DIM_NOT_ALLOWED = message("dim_not_allowed"); public static String DIM_ALREADY_SAVED = message("dim_already_saved"); diff --git a/common/src/main/java/whocraft/tardis_refined/mixin/render/buffer/MixinMainTarget.java b/common/src/main/java/whocraft/tardis_refined/mixin/render/buffer/MixinMainTarget.java index 14006bc1a..8cddf2f6d 100644 --- a/common/src/main/java/whocraft/tardis_refined/mixin/render/buffer/MixinMainTarget.java +++ b/common/src/main/java/whocraft/tardis_refined/mixin/render/buffer/MixinMainTarget.java @@ -2,14 +2,20 @@ import com.mojang.blaze3d.pipeline.MainTarget; import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; import org.lwjgl.opengl.ARBFramebufferObject; import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL30C; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArgs; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.invoke.arg.Args; import whocraft.tardis_refined.client.renderer.vortex.RenderTargetStencil; +import java.nio.IntBuffer; + +import static org.lwjgl.opengl.GL11.GL_DEPTH_COMPONENT; import static org.lwjgl.opengl.GL30.GL_DEPTH32F_STENCIL8; import static org.lwjgl.opengl.GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV; @@ -22,26 +28,61 @@ public MixinMainTarget(boolean useDepth) { throw new RuntimeException(); } - @ModifyArgs(method = "allocateDepthAttachment(Lcom/mojang/blaze3d/pipeline/MainTarget$Dimension;)Z", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;_texImage2D(IIIIIIIILjava/nio/IntBuffer;)V", remap = false)) - private void tardisRefined$modifyTexImage2D(Args args) { - boolean isStencilEnabled = ((RenderTargetStencil) this).tr$getisStencilEnabled(); + @Redirect( + method = "allocateDepthAttachment(Lcom/mojang/blaze3d/pipeline/MainTarget$Dimension;)Z", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/platform/GlStateManager;_texImage2D(IIIIIIIILjava/nio/IntBuffer;)V" + ) + ) + private void onTexImage2D( + int target, int level, int internalFormat, + int width, int height, int border, int format, int type, IntBuffer pixels + ) { + boolean isStencilBufferEnabled = ((RenderTargetStencil) this).tr$getisStencilEnabled(); - if (isStencilEnabled) { - args.set(2, GL_DEPTH32F_STENCIL8); - args.set(6, ARBFramebufferObject.GL_DEPTH_STENCIL); - args.set(7, GL_FLOAT_32_UNSIGNED_INT_24_8_REV); + if (internalFormat == GL_DEPTH_COMPONENT && isStencilBufferEnabled) { + GlStateManager._texImage2D( + target, + level, + GL_DEPTH32F_STENCIL8, + width, + height, + border, + ARBFramebufferObject.GL_DEPTH_STENCIL, + GL_FLOAT_32_UNSIGNED_INT_24_8_REV, + pixels + ); + } + else { + GlStateManager._texImage2D( + target, level, internalFormat, width, height, + border, format, type, pixels + ); } } - @ModifyArgs(method = "createFrameBuffer(II)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;_glFramebufferTexture2D(IIIII)V", remap = false)) - private void tardisRefined$modifyFrameBufferTexture2d(Args args) { - boolean isStencilEnabled = ((RenderTargetStencil) this).tr$getisStencilEnabled(); + @Redirect( + method = "createFrameBuffer(II)V", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/platform/GlStateManager;_glFramebufferTexture2D(IIIII)V" + ) + ) + private void redirectFrameBufferTexture2d( + int target, int attachment, int textureTarget, int texture, int level + ) { + boolean isStencilBufferEnabled = ((RenderTargetStencil) this).tr$getisStencilEnabled(); - if (isStencilEnabled) { - if ((int) args.get(1) == GL30.GL_DEPTH_ATTACHMENT) { - args.set(1, GL30.GL_DEPTH_STENCIL_ATTACHMENT); - } + if (attachment == GL30C.GL_DEPTH_ATTACHMENT && isStencilBufferEnabled) { + GlStateManager._glFramebufferTexture2D( + target, GL30.GL_DEPTH_STENCIL_ATTACHMENT, textureTarget, texture, level + ); + } + else { + GlStateManager._glFramebufferTexture2D(target, attachment, textureTarget, texture, level); } } + } \ No newline at end of file diff --git a/common/src/main/java/whocraft/tardis_refined/registry/TRBlockRegistry.java b/common/src/main/java/whocraft/tardis_refined/registry/TRBlockRegistry.java index cdd67ea0c..f3a33613c 100644 --- a/common/src/main/java/whocraft/tardis_refined/registry/TRBlockRegistry.java +++ b/common/src/main/java/whocraft/tardis_refined/registry/TRBlockRegistry.java @@ -52,7 +52,7 @@ public class TRBlockRegistry { /////////////////////////////////////////////////////////////////////////////// public static final RegistrySupplier CONSOLE_CONFIGURATION_BLOCK = register("console_configuration", () -> new ConsoleConfigurationBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), true, true); public static final RegistrySupplier ASTRAL_MANIPULATOR_BLOCK = register("astral_manipulator", () -> new AstralManipulatorBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion().lightLevel((x) -> { - return x.getValue(GlobalConsoleBlock.POWERED) ? 15 : 0; + return x.getValue(AstralManipulatorBlock.POWERED) ? 15 : 0; })), true, true); public static final RegistrySupplier GRAVITY_WELL = register("gravity_well", () -> new AntiGravityBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), true, true); public static final RegistrySupplier CORRIDOR_TELEPORTER = register("corridor_teleporter", () -> new CorridorTeleporterBlock(BlockBehaviour.Properties.of().strength(3, 3).sound(SoundType.ANVIL).noOcclusion()), true, true); @@ -74,7 +74,7 @@ public class TRBlockRegistry { public static final RegistrySupplier THE_EYE = register("the_eye", () -> new EyeBlock(BlockBehaviour.Properties.copy(Blocks.BEDROCK)), false, false); public static final RegistrySupplier ZEITON_LANTERN = register("zeiton_lantern", () -> new LanternBlock(BlockBehaviour.Properties.copy(Blocks.LANTERN).requiresCorrectToolForDrops()), true, true); public static final RegistrySupplier ARTRON_PILLAR_PORT = register("artron_pillar_port", () -> new Block(BlockBehaviour.Properties.copy(Blocks.BEDROCK)), false, false); - public static final RegistrySupplier ASTRAL_MAP = register("astral_map", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE)), true, true); + // public static final RegistrySupplier ASTRAL_MAP = register("astral_map", () -> new Block(BlockBehaviour.Properties.copy(Blocks.STONE)), true, true); private static RegistrySupplier register(String id, Supplier blockSupplier, boolean addToTab, boolean registerItem) { RegistrySupplier registryObject = BLOCKS.register(id, blockSupplier); diff --git a/common/src/main/java/whocraft/tardis_refined/registry/TRPointOfInterestTypes.java b/common/src/main/java/whocraft/tardis_refined/registry/TRPointOfInterestTypes.java index 34cc4c26b..f7ee5a66b 100644 --- a/common/src/main/java/whocraft/tardis_refined/registry/TRPointOfInterestTypes.java +++ b/common/src/main/java/whocraft/tardis_refined/registry/TRPointOfInterestTypes.java @@ -14,12 +14,12 @@ public class TRPointOfInterestTypes { public static final ResourceKey CONSOLE_UNIT = ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, new ResourceLocation(TardisRefined.MODID, "console_unit")); - public static final ResourceKey ASTRAL_MAP = ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, new ResourceLocation(TardisRefined.MODID, "astral_map")); +// public static final ResourceKey ASTRAL_MAP = ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, new ResourceLocation(TardisRefined.MODID, "astral_map")); + - ; public static final DeferredRegistry POIS = DeferredRegistry.create(TardisRefined.MODID, Registries.POINT_OF_INTEREST_TYPE); public static final RegistrySupplier CONSOLE_UNIT_POI = POIS.register("console_unit", () -> registerPointOfInterest(6, 15, TRBlockRegistry.GLOBAL_CONSOLE_BLOCK.get())); - public static final RegistrySupplier ASTRAL_MAP_POI = POIS.register("astral_map", () -> registerPointOfInterest(1, 1, TRBlockRegistry.ASTRAL_MAP.get())); + // public static final RegistrySupplier ASTRAL_MAP_POI = POIS.register("astral_map", () -> registerPointOfInterest(1, 1, TRBlockRegistry.ASTRAL_MAP.get())); private static boolean hasBeenRegistered = false; public static void init() { @@ -40,7 +40,7 @@ private static PoiType registerPointOfInterest(int maxTickets, int validRange, B public static void registerBlockStates() { if (!hasBeenRegistered) { PoiTypes.registerBlockStates(BuiltInRegistries.POINT_OF_INTEREST_TYPE.getHolderOrThrow(CONSOLE_UNIT), CONSOLE_UNIT_POI.get().matchingStates()); - PoiTypes.registerBlockStates(BuiltInRegistries.POINT_OF_INTEREST_TYPE.getHolderOrThrow(ASTRAL_MAP), ASTRAL_MAP_POI.get().matchingStates()); + // PoiTypes.registerBlockStates(BuiltInRegistries.POINT_OF_INTEREST_TYPE.getHolderOrThrow(ASTRAL_MAP), ASTRAL_MAP_POI.get().matchingStates()); hasBeenRegistered = true; } } diff --git a/common/src/main/java/whocraft/tardis_refined/registry/TRVillagerProfession.java b/common/src/main/java/whocraft/tardis_refined/registry/TRVillagerProfession.java index d3b45ade4..89f4003f9 100644 --- a/common/src/main/java/whocraft/tardis_refined/registry/TRVillagerProfession.java +++ b/common/src/main/java/whocraft/tardis_refined/registry/TRVillagerProfession.java @@ -20,7 +20,7 @@ public class TRVillagerProfession { TRPointOfInterestTypes.CONSOLE_UNIT, TRSoundRegistry.DESTINATION_DING )); - public static final RegistrySupplier ASTRONOMER = registerVillagerProfession("astronomer", () -> createVillagerProfession( + /* public static final RegistrySupplier ASTRONOMER = registerVillagerProfession("astronomer", () -> createVillagerProfession( "astronomer", TRPointOfInterestTypes.ASTRAL_MAP, new Supplier() { @@ -29,7 +29,7 @@ public SoundEvent get() { return SoundEvents.BOOK_PAGE_TURN; } } - )); + ));*/ public static RegistrySupplier registerVillagerProfession(String name, Supplier villagerProfessionSupplier) { return PROFESSIONS.register(name, villagerProfessionSupplier); diff --git a/common/src/main/resources/assets/tardis_refined/textures/gui/desktop.png b/common/src/main/resources/assets/tardis_refined/textures/gui/desktop.png deleted file mode 100644 index a0da76a339a1a3565f0a156bd77b7b61c3793509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9193 zcmeHNXHXMLv<@I3h*A_#dK0CE5E4r0(m^`XTL=k+5<(Js5wOrf6a}SA2^|HLCLjWW zg^q=efQVEPq?Z@)7Vo?}^XAUn_wOc?WcTbj-=6dB*)!Qqq73ylPtvl{0sw%M+FEMH z000@ONd`DhMf$M86`%kB`jh}u3xYA+mj{dUM4{c0JOqC%k_YLBCJp)xEv8!fh}6cb zAIL_tU1C^>Xz?kPzQz{f0lHMdHeBt0U+IZ^UTF<2RpiVBK;SNFfBEXYE$$Gi%%~jj)F+8&4X|A~+rkG5DD*9dQ>r93QmGKt107!P{YVZhM=a=$cB}Jv;z4hhm z8yXH=7r^P>)K}B*n2-^hx@zjgg{x~@yk}tF%3l+uO}sjsL+TFBK&*<24hTJ->hnHG zyPVIT*(UAMIF^?)Lon`swV#$&JEq<$j>EsN`4>GM!LCgQ@7cOdKk;}OJ;z@bpKK&; zvd%okW->c4m}Mo;)I`RJZlW!xE0QxjtEt3Rj)`G@@uZ}>#jJi|WO>xbbPXIQ09321 z*@OFNM-v`8r+-Mcy=~)l%_VwXZei?|Eo(hdOjA1W>D#w0U{lc-q6xbzZ+5>@xS@qD z0;lWCdvw*(c*GeL*s$+n!^ucDhtx|9M+^%+q}*vfhM^vk0DTLY z$sp3X}_QBxEv~66tmhF8G2HMN+;SE$doDygC+>nN9Zsp zN(G&|&lolFP`5R|M(5Ep`iTo$bT?hG%@GWaTD%cVu7uup2E=6}?Z<-2&$M~ll8p7w zzgwv2=50^Ib)Emf*QW9yyY;pXFmK>>8uP2WL=g&Ck3O4Ku@n|-*V?;ga^Jo-MsNkr z)h63T&`D1uFlw^-Cm9jbmC@VhP-*BHOO&m$hiv68tw>qbcj4l(9G@FM7JpD1Rhkbt zY3fkt2M%mP@=}i%6PO^VW0zyA)#TB~0aY$<r$zS813YAXDL4+iQags%+^r z>T}hHnN5L)g>JR@=gP6?(BF>El^>R2YD|~!F*+6At{N6O~1~O&cVAPJVJLAoa z;$Nk?-Eb6oT*^2=Q$EZ%zlInBUlQaKVMD(u}t4A)41}x#YU0K=lGX$mV z(;~-f{RLOFe{34I*aUoJcFSoTXlc9DXsB*gp#4MsR%WFl`M?vM8(eFvT;Y2)o{F42 zBINxu3zr_WNZ0xTDH_9hQn>?17;9uTBjp$29iIq}4@c!EOT=QPr^uKz?sMhNA!_+n zQtR_!J#46DOhMQkj%e{2rNOej33LO?=hVI0RL#|Q_QQ>DcAdY-kEW-;jbyA*W6(+m zFJV4kOWbPX9p*$_gYKl%jZZPR&bi;mY3RA`V>+OdgoDReq*dNWL09khR(RMLvrjLC&dK_kPs zq1Q2Ysy(9nVug~f$Sf)|3L7m+n2o!~)NW}(99}T>U$XK&8J*5q6o;pDTuf=0YFCfL zSG8l*&gHzLOhw&&WR@qIrC>P3p(w8~`w3{S#J&q)@ z1Z2DXh%3-2TtaH+Lau9A_Se0KSJ>Zrzl^=N#o715-k{_$tGVxxjATntuExHNI5J^5 zyLLHsnJVZNM*>-`R?D;JrS5u|5-%h2ne<%jRII_$gZXvwb5r1|Pf8C>VwP2z9U9IB zG8W#n$udcyopVPYw<;5370YG}6IdJYx^GMq{aiHxAOw9B78(+|=33a*Y#N{(aF;RK z`c<1opm*$3CXbk^_pT4ibJAC0aBdU~?3yC|G^K1jid6pSm1IeRnb11~xf$KV8ty6u z2#BCSU>*V_kqPUpBDrc!iBTV22v#|x-%Hq;(w|q{w4-tqQqHqlY4%BSaUjp2Fzo5i zE*wfI48!A> zWtE{=kS5XeZe)FU--$Jpk#3HkXueinw~LEca`#E|r>3doJ>A|jnX}=y&!pvqo#ANN z{&X2p9P%(Cp;k};nn+nO^>NjIe(1(T&^;~C*d(pdo$MaxCERrPDTiaOnwXMlb#(N? z!G-GubgKr(jn2(vGCTyoRpM1crlc~MQBOqHN5`=w$XG9zIGO1f4hgTdWOW$rDZ53) z2N-iu4&8wBx=wvP$7DpUQ%^)@pMqF6k#$jYRY%>hz}?MDj9u`hK=D$56R+q2V}Opv zcAdryzP8<=b5Y>J{`Trg4&7VOb8SS+4^1K7=GS_z6@a`l!dokN(hCt5`^eqU2iU}W zZhk~*_FEHzbyQ|%Wz?gOK1JnSDJPp4nniC%-_m6(3BLKYjiwE3;4g+ywi6e33 zdr9|n)*j8hwi3hdsmq}8N9QYsPR6SzyBQAC8hU8YrCl=0U%Ud-x7(;k6+E^Y(GsyFVi!I%Ke4293=u-^0|LJ<`# zmUgT$W#L!BH>`AH%sUbt@TlS1r3UPo8|UoPV#Haw~I7??i7%CB~`Fmeu_9K*hktJ^?j+ zkzbW0Jbmu83t2!1@my-Db>ro%D&Lp08r1J{`xwphUx&WioEPS93LzrR)4y8ouAA9j zNrj28NecG$eU{8bFQn-!6{jWg^QlgzO$3=jY8;L z{LN(P_f`Wz_&!0tr{BZWyJh)X>5C^py3|-I3Ij^Il{fa*=Mv6BS+$gS0(jTXWkxD8 zZqq1wLua1JlIh4}7)HC=qs_rsxbCwje-XCM_E(*e1U6}YrXCU2-l5^+ zrW)zpjBmS;d!Mzy*5%o!ADm^G4qmFgyW}yx0x;+*%?;XA?6qtk{-&^&a>IfYMc(5T z%whDK{qX_(-zcwc**kQc4pXArYPt1yZwFMWbNf*W#>vKbcg$S8i(6sGSw3AtMCXm$ zi;A-s)cYellj7!Mo9mj3F1`##ET*-4@@G3^7&kR8@NNsVMV#rMS2hSkT{_sI<8%n_e3TEMKObcr@-}wj+vqt9mn8#Ywx^ z*y&w}>2liUh(|$2?9=;B_UbENX~x5f)vMv$)mEJzUV`uaPW89peI?EW>q))~a9f;$rlh(RH>wUZq2dq29jCgWN z%Sr#5+EnWEc3E$Y`_C_&S#@cytRbS6-2J5C><(QtuPPMs@?T1u71WrQr_WjUuPKiL z9aEl+%@^*z%hg=w8JzXHuk{roUfOMO(?c_KA;r=lib7g|-i_QNg6q}XE8*wb!13MP zTx97T`GbQ=_n3`70rM&quWnnjC);BBaxSuU@21#{1$tvkiSUpiWU;GnP_p;M{LVLL z!fz3IwD zDbYV|I$;KM)wyGbV`iDozq(~Nop%|Z(j++@d}`JA=Cf}2K6uX4C&iNvUaH*xS!-6c zNoDwM`CLqXU0oJg@8^IxC)xRXU2Lxc_SP-YOkc_3g;bk(bLWAtiEo0%n~V0BC6+ISayD&~Qdnt{L297jPTu0q4M0Lw#x!z0EZ*8*)xv~&=Bb0$W($UH>KjW<^ z>XU5a(x<6;+gNA+%pLsor0`dOOfC6#LJQv*PsU&sp=+lVZg%g?B!03$g;gMAx^Ce+ z`fU9|70Ey0dWmYB_#1RLzXa8R*+g-xG1 z&SY_kNhtD`ktXF8i^$%hL`Oco9WVNWM^grgx`O7Eu^cA~RBlXfHXls*R-?RdFZ5_% zhK;cf@1LdI_6aj@A%004OwE}QRlK_2FM1UJY)`?F^kyhRhMgs6a65u?39_|=C%uj*u z2p2|bABx5Kc#c#EZVG%BdWJlzo;V~A1PB3w#MJ%JK43mYS{`|v6AEUmrtupDsi(l_ zLLgva;^Mx(zCd3|peN2*TtZe>RvZKt2ZO~(8e({V3<2&ZhQae6Lj1%~L*fxQG?sw& z#PA$q!W})m2?~6Cq;a0#{qw-;>HPtZ!T-hri4So?2#3T?7wId(5OGj`ipOeBS+!<>IljF58S_K{~r61GD%BM52ogc@IG`; zTTOxQaDJGRCj#vRJ8H_vprlbqkffNjgcDp00z%4)!KIK$F_eTX7~<#%cXX7J_ytNE zgD1c-2;?CY2^@$f;YfjHK#pLPtQZIdMv6h8QYbMQC|p(y0RhXBdSIwD;#UX*9GaAs zaQ9!mI)ri}L4hHX($YvcR17Kwbs~9#K#9r9NPxtkP^7H169g&=l>i-i+WJ}~g7>XF3I9Zo=z3`lzbjdAky#s8^niuOR75a5S= zN=Qjdfu&`@GSX04kStj0PbD)X4o}L(LsSV6P!fDJa=0)sQaB`P;fI+@0yvVBqJgR6 zkZ^)0&eYS>U4ie=1)f98KZf;48_EezfUCg?ND?RrEC~aFVG@$2AQ>1`0tSYPfIu+N zFZ!NNXq5l|rG2=4c;tUBx)vHwn&1CO^m9*{AiaL}es(5B<3XLC@Ud} zkdS~&L;i}6_e2qV;W(s_uZ%ZZgSAAa>s~@|HsE~>+t_L0}1-SN&XSP z|IzgyUH^!If290hcKt`!KVsk?DgT#U{~BGie;%fg7}7T&U(!+O0c*1k>6k_3sH>?4 zI5>P}H4yKRBs5qpOFRH@;`HH*4DcZBEJ;XB(AHC@{z888xFow0--apxaO}CZnu;mu zhwWh{7aK~B=PToK`mX57EWy!JhMvKA?X=ZbIXwyfo@1Nta z0n@;CB5wEf@*18xRpG*>kf?hiTQj3&>k=DYdua)}u^*&pjsKdr*DxNu-0;ShDM6Q_ zpkn&!Rju0sagjA!&HhtiwDq{X53@f4>KR?6*y7e+?v$s}4Lpxo9bOsk$D`F+XJ$}+ zBZGrck&*SjW_r}F4*3V>YHDeiCw(`)lod+L%Qf*Iv6 zA^GwXs_%;X>u6Xdjt0;L&?wjcG81?@nEP|Zx2_+L;}0G=pWlHr49ZaeG~_5`FkzL$ z8|E>t9Xp%D#IK6$X=KWA=NS{nw!ghtVh>wCVBx7RJG(I?Qrt^#--sMKzxJ|y{4;L1 za^C0=L{p8xy`Iy*NWZkP%;^l6fQG7$xcTz&O&0PudM@r?qiEWnZE8ALD$TrHe?4S> z-$zZYDuQDizv>+SL}?wpUCAv1@ZUl#`X&f2m<*Df6e;y6k&|~FXy0Jgan+o2{i^`#>a-^rxZ7^i9lN;x=1aTq`edrT--J2#+_1=-h!FdA z(Y4vT27G)EcczHzh02v1)&PfH-Ov)CM6QNqVPXEl=BYrbp;7uB)6GFmzY9DALyzq# zWaRL3kKLZYkv^UF<@0@e70$$kfB{8jw{<%TfMC-xmvT|fK%}f)!zNBt3|QdZxuEb~ zH|9kBjzi{aXdo$gIsgMe`S3p#$Nr@T8HoH}Mm+Yf`SweUzcdRfP#L~HTXRp0cZta? ztQ=cuq;$ym7|iOQ8U0Ar|83*_FUlFy;3OovuwC&AGJ?&Y8#1?{?455mHfRt;g`Hab zz!Amf_9f`*`d26CWp(8O39`Q>^tJnRH+fpB(rHFUw+-$TF4c_|MdqvP{FDv|H@U8^ zv$8#LO0|*5G$N`59 z<xXYAtNCf~JY}XwD?0pU=5zJ_NC#hiG;=Zx) zuUB$AU6+?%s@Cz*)OJ;i)P;|_=YFW9T9s36EyQ|1m|f?1-uRf9xKI4>uw4|(&U!$?A2=Gw$7HvVr}If5$8*B@u_wjvhm z?)gl~R1U-)`0D$65kuTs_b2N&g3WI(t4t^i>0~Gct8~l;2_ga<4%a|FISMk@1!XGw z>hvaxh+8mE0%Nm}Y=8sl|--NY|!?4xhRS_}Jp<)7q`^ zQlI@*f?*CrCRf(YM6^He_>86XN3a?S&Cv%j9U!kO*17v;c-Qr0b$XThG0oM_B!s@o zx%{v$HNyL`@|7t2$p_Wa8X`qGncAA;Eef&%v{RuDq0owOy3?DFQgxqIed0xlZiiEU zq=pkvsGyYV=ZJg&F0bWCX-QU!dvof^NDC9h56)@96|JA z8Oi#R_uswIugrU%;ZkvbXw=2Cg+^7Tc3l5KdF^C_lhaJ!U>19zP)Otn9f(K*WXU<- z_>I%^JGgA@&=Yib+ zwnux>yRLYbT>??1bnkiH{qbl5!x=racH5KKn=xF>6!a^yxW|p$&Dut29N!nN&j*W>_Nmgtp34j8m!L~RNrD-j)clTW>x63dnu{yS6!ey;ka>rM|-ZAt?~M^u9)lAD7}@- zTj!B7pD9dLz4?06$#NiAe2{$zMfo~>gMnjKzxpBZ<^k< z(9=gWy4}o_qrd$2^Br#{=EWC;Io>tnXm5q4`S#vuuS2=?fb7L77TkBPy8Q{qxj}rW zV)|~nlM9=8di&)`gh^~ma!LMU)@vG9?l(9-d~>CSQ6B`4St($WbIYIB6{D(+{4lNk zZf2pXyz>smm^QYnn9cI$crN|P(H?QL$h*DMxaAM!k`!g&nW9B~5_-4HxA0g*bi|VkhCp)z z!4`hKX|LG}$Jc@MBVfnMlJw-gV;oP%6?47Bdv)j(r{| zEGP&G?AT%WqWtZ9k7%n=hb!cczlO_1#GCnZ!=LqzS-nZTw#pJxKK(-Kn(XUO2Vl1g zD#u+W`S$K!oqnTx<4&y~Z~lBzY~@7We5CfhElVMblE4b{W!sD)c1U}Kb-0{Fmly02O-WeI4ZoU^!BT|CcK;^bm;eI6s#G09`SBu1fYSg>W&pxP@=$I-7`5xnXo+kS=t)6Lo+VuATo z54qcMSyx_cJ1QAYHC`!y2yfdDT(A6dm`3G%=W70f3V7VW=a`9>_Ii}bGprh~u2?S0 z`7!~E?-iwDU*MwHy07pQwM9^CY0gw5PM!BOirV~moFZt)dN;KS3K zkom!->LQx^Y<$j2M`nJ#((KSV43gb^|wl-8u zsRyWdSo;ib9-m6jez3J2@D3Jc!xWG7t>NT|wB|M7lkAF+^h(ozn&>SmN~aiPnum!H_g-+ zN>m%p_)e;K=3Lx*`kwD8(C$Qok*Du;gto=W@m{_B$!~Eo{m<&tGr!Hc>!h)URyA8x z57f3k$PM4t(encb#J&}MZl<-yG%qky__EO3ha!Me*&=t>G=h;rwK8f^%lXGOeb&>= zZ%s6|Gdu<8%qk&qp&zN*}~ z^6=I5F@k&VyPlNhqA-(P(q4>^CS|{NXl&25MGM8K+hH0)&G>-R_9peO2JQ254QHTb znKLG^Xousab$uV}>Bj-uHxaULMcvYTMzwYyO4&;;o;|3dP3tuu%rGNBXP4^y=Q2!| zmGe*CX)a87ku`jrXZz(!;;QUxx_$VN``d&E1A#LTllL30Yn&i?zrw?zRvImOwRhJn zfda!{KM9`M(E6%I@D&+hha}+a422jGl0|w{+jRQ$j;rE4my5R(i4W#;*-X9XO6+fE z!4q{_q78y}?#k}63B`B>y;>g%bwb`b$UL zv%ifW1n#+m%(}02PlkO6;&&G4&|rD7|M+&ar03lL{@wOx89rQ0{-rO0kJnDkYH#OW zKGjTXUe%XTrku;nR5ZGCV9jQP7q)dm=xuPW3f_0S>|!Hy0dX}E*)wF%JNo6#D*XA~m-Npy>zx~IH|hUPdO|M{C@v^VDG z3CgrG!BHUtgP)B1jjOqhzdwm?l-E*Xa`rnHa$`9EhY#=V(8|%L(mzABd)>3(;M!XU#?dRRO}3kAD@$!>h=)&COyzloNL5U44Y?bc>R5{#=|m#) za%fxYvlI9yY+DL1FBYE_1JK7+&{8^J6oUnALpI}Ql-I{DzMrD~5=fHlvj0LY*_!T_3P^B zY*S|C7h*i`BuI_^7lbu)I(~p>o_8N@WYsb zwx04E#PN>Ur+hc+`AD-I5sc%U{m_%^#WEZy=A`6cJEoTg11|O+bUgZPFjI-1#QEIUIgBnR9u~NKU{uvSd7+M1 zza&F7kR!AkeJRMqnLDevto$-80jo89{gG>k)>$D=2G%t70O60IM3|MdWcgXA678b|9o2SjIOh)km=a`saLk)uP(>vFW`;|=U#7Nhd|mmg*P%0I(h+X)P*%w3wI5Z zOjC-NM+KD31wMS^U3$aRRW;05-#>WXGkv6gxR{i}FAC~0t)lsMGVBf}M)LW2VFTni zmZ+6x2n~*7X-F!$b&nnuF?=$W$G(zY+atS~VsM8h)bF{IZHV#L$vXP3dnq4y3nHmp ze3#~V_;{Snqq3ANKfDiPrY>mT?tq3_^Kh~((Vj)cb3Zh2NT=-Y4h{BkdNX|f&b3I5 zPfTBPgN%CQ)0H;|v?dc}8IXem@~0wVNfVN?JtEgDtn!Bn`~stN8QYmhYx2Ia^tUr( zh>9Aw8R*Uw2o;4-@f2+b2yQ>6ZUa-7*|=OibN|bU7M*Jsf~|Qj#ro$L9523QC^G%7 zoCTcvDy62_#KvK!dn@He@(0*W3T?Kus?ad^k~VbDclpr-GYiP#IZ7KVBd>{u98Ph2&p*pT{c}Ya-)6VJB z!CUY`t<+4vQyX5_of1oXBwlEjUsNhDxv9qD#^Uh45PAOxV684Q@3xxXKzR#OZe>Jn z_2z8xNzeWKZ0b6rbdf7d>Y>)w+?2pZP_Zold&<#XANs{7`a&-K;keh*CBbJ2iVPu) z5%kt6*-Q&3QHm^in~1Adht~Q}oZgAY`iU!EhEjGx#aZL&K|qS{J0D5(hJ(+R!kBmZ z7d_PmMV<7n>aTp%gw+&!dcZnowigK_n;F4#*&*>C2DsuD`@6@mT=Y}NMF#Aii9Zz2 zrWC%MqsMu_eC5Pgl?TjniptbI^~tOD<-5W)#J9^aG40yeyWEpyeFsL2Q(jh$?}sui z?s~$FA_dCLdFL0?5iDkn)4aSzWht99>GXay!E@TY^6bEm4y0?Tt&DoFW#>E7N)rT$ zhSK-0;$!jrtfFr%{cRl}@hKZDC$}Ei@m*N@&R`VXjN`u@=qk$80tnJYj$9OasY5M_ zr28J1uPRndrzS30Xmy*d&EPFh7^ai3F+sSQDzSJM(3}7MqRAt}93Bxkvi}rx&77wP z<)p)s6hRTZGRfru}2y;KkAgRPw{&;l@SG`)N;4qUN*ZrM`&uFAgVjG&xr zzj8oi-v`UvX990sF9pDCraHx|S#%kwN5w95>2Fv_Xftx2ek{t5VBRT}^Vg@|u8idu z<5bHLI8`D0ChnriLV1x-S46E-QwLT4nP5490PT0jl&^(1@}Ed3sJ~FPPGf}4Z4RCi zKVwt3u_B$0FdJ)J4HsPD6)Ip{dEnf5AN3`)RFfw6&V5wA@|%^?h6()>;v=NjHCEFi z)w5?K=@C3Bnh5zCimGedT_U_miA^qvd6jn%shpvqG&^oL_Mb5xDE5caeh-BtRtPP< z{BlTZ>3I4n)0zwi`OGX5uc2Y0r=jutF&X)AEHgL>q5Djgzth3269_u)%j(r-l4Z-< zO1OQNvt1p3u4c)RxX1;?>zdl}(+o#k6}oOg%jIM*U`M0&g{ot)Q*S^^|A&LA^NCOG zUMiClLF3I-k+_r++-q2_OKOr)N2gtg#pj@?FjmSKlr5?-yZ1cqqe9E-$4|@l@lF9b zd)|?^Bf0@Ox=Jrd&w!J{*&{WizP%2lWh%$C_jIuumuSdLXjsCKEFkTplgX06U95tDdPhsMG> zW}q|)1vK3AVmW;H$vDa2v=vP}KVz|4)XYx%;RnAuoEPz_A;a_VNv^R2Zkq4D;g-)H zw{Kt9$40F+ex2}ranmL!bAI^jJKz_q4UpfDbT09wf!f(;28 zSZBO$AQ5X8Xk?BKbVVy*fGWxiO8#&%fIF6i6!v#_^YDiIBY;0~;pFj=SPCfo(}d)T z09qTG2y1u}vBFSEs3aJq<&XD;0F@bpm53M|+*DKhHwf|-0_aR45#Ul%etv$Eeln7t zL?4@TE1kE-xB&CJ-p4yr@vCBSZ_}s zA{wjZi}fIh{1pO&{==W(Lv;ID4hAiSb;G)oO})ucrT-REN6*mY504`Xobc|1pI&6L z|7JMlLjF%7zjuK3Bk$B;BYv!4DK&bdLG^+qz4*%1Vsjy#FKI4 zVDcy=8X^b6pcQ06P#6pXLV;0oAS_xQtAK;bBOwaNzd#rh@#L;Vy8Sh)BPa|R3Mq|I zP>=&-K{C=<6bMT82O-hqFF6?$S^*-9CMPTV6AFWdYkLyik>u&byCa>jQUnjDpNb>G z;c6y&2p~if{HMgk4N1b09ms0{?}733^Zrw1j(5kJk&s7xO3TU1LF8dz2t-~+79t1x z)5sD_^d|S>5vnv;QU>x0c}h}88{+SisU-D(O!qH?zwDr7 zT7JpMJ2QEsm-=I;|BbJsJ@vo%`mN3WixJ4s{|5O-{QgVVzjXa02L6%pzuomOUH^!I ze`Ne`cm2ocV)*l35$i$zgXc%S6O7D8s*~>`kD&~7Gy#W4@7(61TVx46LD$9`0AOT4 z`cMEeGP%h@T9Tfj7VSJGGo2J=vohr*06=A=r>SO6espHkSf3Bc-S$zQ&1$uYg*q>K zL2Q)$wz_04U4(&}_$Flp>C=$MlW+=zx-b)_q~329I03sK8Q-S#s&C2*fV7P zRm}-<6aYX~aZ@h%Q{{D)b*zI5fAEUU(3U~-;ao{Z?Pyiz2Wpc>c=eP@YKzC0ebaVD z!eGGK!QG;zp-Fl`OiWD3h&;!j)7QQ0viAf`*IENgx2or<0ofE~Er-??IlzD$N{r51 z`%b0%^2USZ&Flb^Rh~BJT`kRy)wp59?Ci9V{n^cZt516kvmV)Fcbj5jx)`>$*Nd8K z=UymTv~Kay2&cU0zG}=qSAsti_9!aE_=aX)PxoFmKY!g; zu(ks-8cPn33s!KT-O^%1In@@}$zHX%qa{?^C zTxO$@?J+P^oZY)blKn0(G*`0ax<(BUsQbEaK0w8={bQn0%CPn)8AM9JnXp&(H`eA8 zZbhf#WNKFzQk+9!x?7>^uip9&llg#O0H_{414RvB{f`Y;0R{j{03ARW5C-^94gPaT ze`NFrq$=%(*}=nsf!!w(p*sfz$8Gj>Ts6zyh);GAyw^CccCE-RF@gWuX=cfloTA6Q ruZ@-r^Mi!Ui=ai;fd8+ru)RkTPIWRX>|FBGtyQGYSLf9|<=&i9?~e&@{H z8WOzB&h`^q0Dzr1NDvBu1sPfZ>lx%0rOS^aw~q;7BoT(i5k{#F1^#ku4GM`hQUw}{ zO65swe?gZ5FwIpJ9!W$>R`6t)hAuVd&`lbgL<6wY*Mv)DYLtN1pbC|iPwgtJph7A+ zpBllDFeG>&s#FCf>(H>|;BZ;8T87A}zCO@W6OSa&poA1MX%e)0o{3K#aD`5LA| zV=081PyI(!q$C6i#B?Zx(3vzDgTaKn5xSHs_w?qlJ(0x_i@{>U3^vSS)0k`?gTwRW zK;w%_7Sze(c%cH(cscUKrz!~o=fSYiXrvq2bWEp!nFxZw3>M5{(Z~#%K1oYRO*F0E zd4fTJ>Sa0=PN*;~WM-7E!3+eSN{apG6&hS3nIzWg$Gsw5gH2K#X3`n3Mq_^3Shk)B zMPJK!W41m#2}j{jRF4^SGO{Ic&J$qLzIPWgCz5J-0!(JmpjtvK;8V#Px?Cmau{ePY zmXIOx4`2$JOrZ$z^bQaSnBF3hzbC>)yeF_?t)7r-W#|M}^%^UDCzcneL!|_!3&*g8 zi3Wx!F#^*oF&tvC=}gEiLZy{sM!mb)+i|I=PL+ttMLJ9ajhVw!y+J?#!a|rV4$E64 z;E>`4{{C!%AP`{$3K35)FAhmo zOHRCw9PO5Fg&P2r3bDXH+|>A_r9$l}om=@wR7y^*z11}v;g_FpBkrRNvO8Xx3dZ zRTgG9ewyzy{B6gG>&njPVr)tGVo*9`S9IvUj$@l7J74&9xs1dg6GIK(wXiJGZE}j+ zntjg=m)`j1F5=ray1KGUoKrGdby3c0?{5H(U?2Dq5AG@8UXK{$#I)6|JKTC>{;;ou z%Swmr>dowm>dO=`-4#F}9RN#UJ!OG)`U3L*rT}~3Xa2~iB$zs;Nkx;CIp9+C-G;tf zK?&lc>5hI$>+Zx~^4iZ$!vBaFekYy|99#3Z}qwCBCevV^>%)|m_k zyE9sadgiKGiCg3`{WQ>Ha(Z}2L^T*p^GZD)mR{&hO) p5>&MrrmW|aL-hYNAA;B0GQd%r_MdW!XYU5&5(|R`MFFvye*<^)smcHV diff --git a/common/src/main/resources/assets/tardis_refined/textures/gui/gallifreyan_symbols.png b/common/src/main/resources/assets/tardis_refined/textures/gui/gallifreyan_symbols.png deleted file mode 100644 index 2c035d05f34f5ce36aaee442139501cd42a9999a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38316 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 Xi3(bLA#VRq@Xzd^)q%WU+%EhV2kgjA diff --git a/common/src/main/resources/assets/tardis_refined/textures/gui/gui_black.png b/common/src/main/resources/assets/tardis_refined/textures/gui/gui_black.png deleted file mode 100644 index d8b37648e2ce135f72f3295032bcadd96441c53d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBuf-vKbiP>*~f=Zq)jv*HQ$tej5KlqQNFso_!nn{=@TwxFZ fk`H(j5*QeK9T??Hto3FARWo?H`njxgN@xNAq~#)5 diff --git a/common/src/main/resources/assets/tardis_refined/textures/gui/monitor.png b/common/src/main/resources/assets/tardis_refined/textures/gui/monitor.png deleted file mode 100644 index e5831b06ae37cacc633517568d0f33c0865a2d39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2114 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 literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/tardis_refined/textures/gui/monitor/frame_brass.png b/common/src/main/resources/assets/tardis_refined/textures/gui/monitor/frame_brass.png new file mode 100644 index 0000000000000000000000000000000000000000..952645b3ba8643920ba5b3372a08501edb23b45b GIT binary patch literal 1954 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