Skip to content

Commit 4688033

Browse files
committed
WIP implementation of Gander-powered Room Previews
Kinda spammy for some blocks, but functional. Needs more work on Gander's side before release is ready.
1 parent c028da8 commit 4688033

31 files changed

+421
-559
lines changed

gradle/compactmods.versions.toml

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
[versions.feather]
2-
require = "0.1.8"
1+
[versions]
2+
gander = "[0.2.3]"
3+
feather = "[0.1.8]"
34

45
[versions.spatial]
56
require = "[0.2.0, 0.3)"
@@ -12,3 +13,22 @@ version.ref = "feather"
1213
[libraries.spatial]
1314
module = "dev.compactmods:spatial"
1415
version.ref = "spatial"
16+
17+
[libraries.ganderCore]
18+
module = "dev.compactmods.gander:core"
19+
version.ref = "gander"
20+
21+
[libraries.ganderLevels]
22+
module = "dev.compactmods.gander:levels"
23+
version.ref = "gander"
24+
25+
[libraries.ganderRendering]
26+
module = "dev.compactmods.gander:rendering"
27+
version.ref = "gander"
28+
29+
[libraries.ganderUI]
30+
module = "dev.compactmods.gander:ui"
31+
version.ref = "gander"
32+
33+
[bundles]
34+
gander = ["ganderCore", "ganderLevels", "ganderRendering", "ganderUI"]

neoforge-main/build.gradle.kts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ var envVersion: String = System.getenv("VERSION") ?: "9.9.9"
88
if (envVersion.startsWith("v"))
99
envVersion = envVersion.trimStart('v')
1010

11-
val modId: String = "compactmachines"
1211
val isRelease: Boolean = (System.getenv("RELEASE") ?: "false").equals("true", true)
12+
val modId: String = "compactmachines"
1313

1414
val coreApi = project(":core-api")
1515

@@ -146,6 +146,20 @@ repositories {
146146

147147
maven("https://maven.pkg.github.com/compactmods/feather") {
148148
name = "Github PKG - Feather"
149+
content {
150+
includeGroup("dev.compactmods")
151+
includeModule("dev.compactmods", "feather")
152+
}
153+
154+
credentials {
155+
username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR")
156+
password = project.findProperty("gpr.token") as String? ?: System.getenv("GITHUB_TOKEN")
157+
}
158+
}
159+
160+
maven("https://maven.pkg.github.com/compactmods/gander") {
161+
name = "Github PKG - Gander"
162+
content { includeGroup("dev.compactmods.gander") }
149163
credentials {
150164
username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR")
151165
password = project.findProperty("gpr.token") as String? ?: System.getenv("GITHUB_TOKEN")
@@ -175,6 +189,7 @@ dependencies {
175189
compileOnly(libs.jnanoid)
176190
testImplementation(libs.jnanoid)
177191
jarJar(libs.jnanoid)
192+
additionalRuntimeClasspath(libs.jnanoid)
178193

179194
compileOnly(coreApi)
180195
testCompileOnly(coreApi)
@@ -186,7 +201,6 @@ dependencies {
186201
testImplementation("org.junit.jupiter:junit-jupiter:5.7.1")
187202
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
188203

189-
additionalRuntimeClasspath(libs.jnanoid)
190204

191205
compileOnly(compactmods.feather)
192206
testImplementation(compactmods.feather)
@@ -196,6 +210,11 @@ dependencies {
196210
implementation(compactmods.spatial)
197211
testImplementation(compactmods.spatial)
198212
jarJar(compactmods.spatial) { isTransitive = false }
213+
214+
// Gander
215+
implementation(compactmods.bundles.gander)
216+
accessTransformers(compactmods.ganderRendering)
217+
jarJar(compactmods.bundles.gander)
199218
}
200219

201220
tasks.withType<Test> {

neoforge-main/src/main/java/dev/compactmods/machines/client/keybinds/room/RoomExitKeyMapping.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.mojang.blaze3d.platform.InputConstants;
44
import dev.compactmods.machines.api.CompactMachines;
55
import dev.compactmods.machines.api.dimension.CompactDimension;
6-
import dev.compactmods.machines.network.PlayerRequestedLeavePacket;
6+
import dev.compactmods.machines.network.room.PlayerRequestedLeavePacket;
77
import net.minecraft.Util;
88
import net.minecraft.client.KeyMapping;
99
import net.minecraft.client.Minecraft;

neoforge-main/src/main/java/dev/compactmods/machines/client/keybinds/room/RoomUpgradeUIMapping.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import dev.compactmods.machines.api.CompactMachines;
55
import dev.compactmods.machines.api.dimension.CompactDimension;
66
import dev.compactmods.machines.feature.CMFeatureFlags;
7-
import dev.compactmods.machines.network.PlayerRequestedUpgradeUIPacket;
7+
import dev.compactmods.machines.network.room.PlayerRequestedUpgradeUIPacket;
88
import dev.compactmods.machines.room.Rooms;
99
import net.minecraft.Util;
1010
import net.minecraft.client.KeyMapping;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package dev.compactmods.machines.client.machine;
2+
3+
import dev.compactmods.gander.level.VirtualLevel;
4+
import dev.compactmods.gander.render.geometry.LevelBakery;
5+
import dev.compactmods.machines.api.machine.MachineColor;
6+
import dev.compactmods.machines.api.machine.MachineConstants;
7+
import dev.compactmods.machines.client.room.MachineRoomScreen;
8+
import dev.compactmods.machines.machine.Machines;
9+
import dev.compactmods.machines.network.machine.OpenMachinePreviewScreenPacket;
10+
import net.minecraft.client.Minecraft;
11+
import net.minecraft.core.BlockPos;
12+
import net.minecraft.core.GlobalPos;
13+
import net.minecraft.network.chat.Component;
14+
import net.minecraft.util.RandomSource;
15+
import net.minecraft.world.level.block.Block;
16+
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings;
17+
import org.joml.Vector3f;
18+
19+
public class ClientMachinePacketHandler {
20+
public static void setMachineColor(GlobalPos position, MachineColor newColor) {
21+
var mc = Minecraft.getInstance();
22+
assert mc.level != null;
23+
if (mc.level.dimension() == position.dimension()) {
24+
var state = mc.level.getBlockState(position.pos());
25+
var blockEntity = mc.level.getBlockEntity(position.pos());
26+
if(state.is(MachineConstants.MACHINE_BLOCK)) {
27+
blockEntity.setData(Machines.Attachments.MACHINE_COLOR, newColor);
28+
mc.level.sendBlockUpdated(position.pos(), state, state, Block.UPDATE_ALL_IMMEDIATE);
29+
}
30+
}
31+
}
32+
33+
public static void openRoomPreviewScreen(OpenMachinePreviewScreenPacket pkt) {
34+
final var mc = Minecraft.getInstance();
35+
mc.setScreen(new MachineRoomScreen(Component.empty(), pkt.machinePos(), pkt.roomCode()));
36+
if(mc.screen instanceof MachineRoomScreen mrs) {
37+
var virtualLevel = new VirtualLevel(Minecraft.getInstance().level.registryAccess(), true);
38+
var bounds = pkt.internalBlocks().getBoundingBox(new StructurePlaceSettings(), BlockPos.ZERO);
39+
virtualLevel.setBounds(bounds);
40+
pkt.internalBlocks().placeInWorld(virtualLevel, BlockPos.ZERO, BlockPos.ZERO, new StructurePlaceSettings().setKnownShape(true), RandomSource.create(), Block.UPDATE_CLIENTS);
41+
42+
var bakedLevel = LevelBakery.bakeVertices(virtualLevel, bounds, new Vector3f());
43+
mrs.updateScene(bakedLevel);
44+
}
45+
}
46+
}

neoforge-main/src/main/java/dev/compactmods/machines/client/machine/MachineClientEvents.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,12 @@
22

33
import dev.compactmods.machines.machine.Machines;
44
import dev.compactmods.machines.room.Rooms;
5-
import dev.compactmods.machines.room.ui.preview.MachineRoomScreen;
5+
import dev.compactmods.machines.client.room.MachineRoomScreen;
66
import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent;
77
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
88

99
public class MachineClientEvents {
1010

11-
public static void registerMenuScreens(final RegisterMenuScreensEvent evt) {
12-
evt.register(Rooms.Menus.MACHINE_MENU.get(), MachineRoomScreen::new);
13-
}
14-
1511
public static void onItemColors(final RegisterColorHandlersEvent.Item colors) {
1612
colors.register(MachineColors.ITEM, Machines.Items.BOUND_MACHINE.get(), Machines.Items.UNBOUND_MACHINE.get());
1713
}

neoforge-main/src/main/java/dev/compactmods/machines/client/machine/MachinesClient.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
public interface MachinesClient {
66
static void registerEvents(IEventBus modBus) {
7-
modBus.addListener(MachineClientEvents::registerMenuScreens);
87
modBus.addListener(MachineClientEvents::onBlockColors);
98
modBus.addListener(MachineClientEvents::onItemColors);
109
}

neoforge-main/src/main/java/dev/compactmods/machines/client/room/ClientRoomPacketHandler.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,34 @@
11
package dev.compactmods.machines.client.room;
22

3+
import dev.compactmods.gander.level.VirtualLevel;
4+
import dev.compactmods.gander.render.geometry.LevelBakery;
35
import dev.compactmods.machines.room.Rooms;
4-
import dev.compactmods.machines.room.ui.preview.MachineRoomScreen;
56
import net.minecraft.client.Minecraft;
7+
import net.minecraft.core.BlockPos;
8+
import net.minecraft.util.RandomSource;
9+
import net.minecraft.world.level.block.Block;
10+
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings;
611
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
12+
import org.joml.Vector3f;
713

814
import java.util.UUID;
915

1016
public class ClientRoomPacketHandler {
1117
public static void handleBlockData(StructureTemplate blocks) {
1218
final var mc = Minecraft.getInstance();
1319
if(mc.screen instanceof MachineRoomScreen mrs) {
14-
mrs.getMenu().setBlocks(blocks);
15-
mrs.updateBlockRender();
20+
21+
var virtualLevel = new VirtualLevel(Minecraft.getInstance().level.registryAccess(), true);
22+
var bounds = blocks.getBoundingBox(new StructurePlaceSettings(), BlockPos.ZERO);
23+
virtualLevel.setBounds(bounds);
24+
blocks.placeInWorld(virtualLevel, BlockPos.ZERO, BlockPos.ZERO, new StructurePlaceSettings().setKnownShape(true), RandomSource.create(), Block.UPDATE_CLIENTS);
25+
26+
var bakedLevel = LevelBakery.bakeVertices(virtualLevel, bounds, new Vector3f());
27+
28+
mrs.updateScene(bakedLevel);
29+
30+
// mrs.getMenu().setBlocks(blocks);
31+
// mrs.updateBlockRender();
1632
}
1733
}
1834

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package dev.compactmods.machines.client.room;
2+
3+
import dev.compactmods.gander.render.geometry.BakedLevel;
4+
import dev.compactmods.gander.ui.widget.SpatialRenderer;
5+
import dev.compactmods.machines.api.CompactMachines;
6+
import dev.compactmods.machines.client.widget.ImageButtonBuilder;
7+
import dev.compactmods.machines.feature.CMFeatureFlags;
8+
import dev.compactmods.machines.network.room.PlayerRequestedTeleportPacket;
9+
import dev.compactmods.machines.network.room.PlayerRequestedUpgradeUIPacket;
10+
import dev.compactmods.machines.network.room.PlayerStartedRoomTrackingPacket;
11+
import net.minecraft.client.gui.GuiGraphics;
12+
import net.minecraft.client.gui.components.ImageButton;
13+
import net.minecraft.client.gui.components.WidgetSprites;
14+
import net.minecraft.client.gui.navigation.ScreenRectangle;
15+
import net.minecraft.client.gui.screens.Screen;
16+
import net.minecraft.core.GlobalPos;
17+
import net.minecraft.network.chat.Component;
18+
import net.minecraft.world.phys.AABB;
19+
import net.neoforged.neoforge.network.PacketDistributor;
20+
21+
public class MachineRoomScreen extends Screen {
22+
23+
private final GlobalPos machinePos;
24+
private final String roomCode;
25+
26+
private SpatialRenderer renderer;
27+
28+
private ImageButton psdButton;
29+
private ScreenRectangle screenArea;
30+
31+
public MachineRoomScreen(Component title, GlobalPos machinePos, String roomCode) {
32+
super(title);
33+
this.machinePos = machinePos;
34+
this.roomCode = roomCode;
35+
36+
// Send packet to server for block data
37+
PacketDistributor.sendToServer(new PlayerStartedRoomTrackingPacket(roomCode));
38+
}
39+
40+
@Override
41+
protected void init() {
42+
super.init();
43+
44+
final var psdBtnSprites = new WidgetSprites(
45+
CompactMachines.modRL("personal_shrinking_device"),
46+
CompactMachines.modRL("personal_shrinking_device_disabled"),
47+
CompactMachines.modRL("personal_shrinking_device_highlighted"),
48+
CompactMachines.modRL("personal_shrinking_device_disabled"));
49+
50+
this.screenArea = new ScreenRectangle((height / 2) - 120, (width / 2) - 130,
51+
260, 240);
52+
53+
this.psdButton = ImageButtonBuilder.button(psdBtnSprites)
54+
.size(12, 12)
55+
.location(screenArea.right() - 12, screenArea.bottom() + 12)
56+
.onPress(btn -> {
57+
PacketDistributor.sendToServer(new PlayerRequestedTeleportPacket(machinePos, roomCode));
58+
}).build();
59+
60+
addRenderableWidget(psdButton);
61+
62+
// EXPERIMENTAL: Room Upgrades
63+
roomUpgradesButton();
64+
}
65+
66+
private void roomUpgradesButton() {
67+
if(this.minecraft == null || this.minecraft.getConnection() == null) return;
68+
if(CMFeatureFlags.ROOM_UPGRADES.isSubsetOf(minecraft.getConnection().enabledFeatures()))
69+
{
70+
final var upgradeBtnSprites = new WidgetSprites(
71+
CompactMachines.modRL("upgrade_btn"),
72+
CompactMachines.modRL("upgrade_btn")
73+
);
74+
75+
var upgradeScreenBtn = ImageButtonBuilder.button(upgradeBtnSprites)
76+
.size(12, 12)
77+
.location(screenArea.right() - 24, screenArea.bottom() + 12)
78+
.onPress(btn -> {
79+
PacketDistributor.sendToServer(new PlayerRequestedUpgradeUIPacket(roomCode, false));
80+
}).build();
81+
82+
addRenderableWidget(upgradeScreenBtn);
83+
}
84+
}
85+
86+
@Override
87+
public void render(GuiGraphics graphics, int pMouseX, int pMouseY, float pPartialTick) {
88+
super.render(graphics, pMouseX, pMouseY, pPartialTick);
89+
90+
final var pose = graphics.pose();
91+
pose.pushPose();
92+
{
93+
pose.translate(this.width / 2f, 0, 0);
94+
95+
// graphics.drawCenteredString(font, this.ti, 0, this.titleLabelY, 0xFFFFFFFF);
96+
97+
var rt = Component.literal(roomCode);
98+
pose.scale(0.7f, 0.7f, 0.7f);
99+
graphics.drawCenteredString(font, rt, 0, font.lineHeight + 7, 0xFFDEDEDE);
100+
}
101+
pose.popPose();
102+
103+
pose.pushPose();
104+
{
105+
pose.translate(screenArea.left(), screenArea.top(), 0);
106+
pose.translate(screenArea.width() / 2f, 0, 0);
107+
108+
// graphics.drawCenteredString(font, Component.literal("Room preview broken for a bit"),
109+
// 0, 100, 0xFFCCCCCC);
110+
}
111+
pose.popPose();
112+
}
113+
114+
@Override
115+
public void onClose() {
116+
super.onClose();
117+
}
118+
119+
public void updateScene(BakedLevel bakedLevel) {
120+
if(this.renderer != null) {
121+
this.renderer.dispose();
122+
renderables.remove(renderer);
123+
}
124+
125+
this.renderer = addRenderableOnly(new SpatialRenderer(bakedLevel));
126+
renderer.camera().zoom(calculateZoomForRoom(AABB.of(bakedLevel.blockBoundaries())));
127+
renderer.camera().lookUp(3 / 12f);
128+
}
129+
130+
private static float calculateZoomForRoom(AABB internalSize) {
131+
double maxSize = Math.max(internalSize.getXsize(), internalSize.getZsize());
132+
return (float) (-1.0f * maxSize) - 10;
133+
}
134+
}

0 commit comments

Comments
 (0)