Skip to content

Commit c664b57

Browse files
committed
Fix placement helper, creative tab
1 parent 729dfd5 commit c664b57

File tree

8 files changed

+82
-123
lines changed

8 files changed

+82
-123
lines changed

neoforge-main/src/main/java/dev/compactmods/crafting/client/ClientEventHandler.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package dev.compactmods.crafting.client;
22

33
import dev.compactmods.crafting.CompactCrafting;
4+
import dev.compactmods.crafting.client.render.GhostProjectorPlacementRenderer;
45
import net.minecraft.client.Camera;
56
import net.minecraft.client.Minecraft;
67
import net.minecraft.client.multiplayer.ClientLevel;
7-
import net.minecraft.client.player.LocalPlayer;
88
import net.minecraft.client.renderer.MultiBufferSource;
99
import net.minecraft.world.phys.HitResult;
1010
import net.neoforged.api.distmarker.Dist;
@@ -22,11 +22,7 @@ public class ClientEventHandler {
2222
public static void onTick(final TickEvent.ClientTickEvent evt) {
2323
if (evt.phase != TickEvent.Phase.START) return;
2424

25-
final LocalPlayer player = Minecraft.getInstance().player;
26-
if (player != null) {
27-
// player.getCapability(CCCapabilities.TEMP_PROJECTOR_RENDERING)
28-
// .ifPresent(IProjectorRenderInfo::tick);
29-
}
25+
GhostProjectorPlacementRenderer.tick();
3026

3127
ClientLevel level = Minecraft.getInstance().level;
3228
if (level != null && !Minecraft.getInstance().isPaused()) {
@@ -42,7 +38,7 @@ public static void onWorldRender(final RenderLevelStageEvent event) {
4238
return;
4339

4440
if (event.getStage().equals(RenderLevelStageEvent.Stage.AFTER_PARTICLES)) {
45-
doProjectorRender(event, mc);
41+
GhostProjectorPlacementRenderer.render(event.getPoseStack());
4642
doFieldPreviewRender(event, mc);
4743
}
4844
}
@@ -88,9 +84,4 @@ private static void doFieldPreviewRender(RenderLevelStageEvent event, Minecraft
8884
// });
8985
buffers.endBatch();
9086
}
91-
92-
private static void doProjectorRender(RenderLevelStageEvent event, Minecraft mc) {
93-
// mc.player.getCapability(CCCapabilities.TEMP_PROJECTOR_RENDERING)
94-
// .ifPresent(render -> render.render(event.getPoseStack()));
95-
}
9687
}

neoforge-main/src/main/java/dev/compactmods/crafting/client/render/CCRenderTypes.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,25 @@
88

99
public class CCRenderTypes {
1010

11-
protected static final RenderStateShard.ShaderStateShard BLOCK_SHADER = new RenderStateShard.ShaderStateShard(GameRenderer::getRendertypeTranslucentMovingBlockShader);
11+
protected static final RenderStateShard.ShaderStateShard BLOCK_SHADER =
12+
new RenderStateShard.ShaderStateShard(GameRenderer::getRendertypeTranslucentMovingBlockShader);
1213

1314
public static final RenderType FIELD_RENDER_TYPE = RenderType.create("projection_field",
1415
DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 256,
1516
RenderType.CompositeState.builder()
1617
.setShaderState(RenderStateShard.POSITION_COLOR_SHADER)
1718
.setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY)
18-
.setCullState(new RenderStateShard.CullStateShard(true))
19+
.setCullState(new RenderStateShard.CullStateShard(false))
1920
.setWriteMaskState(new RenderStateShard.WriteMaskStateShard(true, false))
2021
.createCompositeState(false));
2122

22-
public static final RenderType PHANTOM = RenderType.create("phantom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 2097152, true, false, RenderType.CompositeState.builder()
23-
.setShaderState(BLOCK_SHADER)
24-
.setLightmapState(RenderStateShard.LIGHTMAP)
25-
.setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED)
26-
.setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY)
27-
.createCompositeState(true));
23+
public static final RenderType PHANTOM = RenderType.create("phantom", DefaultVertexFormat.BLOCK,
24+
VertexFormat.Mode.QUADS, 2097152,
25+
true, false,
26+
RenderType.CompositeState.builder()
27+
.setShaderState(BLOCK_SHADER)
28+
.setLightmapState(RenderStateShard.LIGHTMAP)
29+
.setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED)
30+
.setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY)
31+
.createCompositeState(true));
2832
}

neoforge-main/src/main/java/dev/compactmods/crafting/client/render/ClientProjectorRenderInfo.java renamed to neoforge-main/src/main/java/dev/compactmods/crafting/client/render/GhostProjectorPlacementRenderer.java

Lines changed: 34 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.mojang.blaze3d.systems.RenderSystem;
44
import com.mojang.blaze3d.vertex.PoseStack;
55
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
6-
import dev.compactmods.crafting.api.projector.IProjectorRenderInfo;
76
import dev.compactmods.crafting.client.ClientConfig;
87
import dev.compactmods.crafting.core.CCBlocks;
98
import dev.compactmods.crafting.projector.FieldProjectorBlock;
@@ -22,44 +21,48 @@
2221

2322
import java.util.HashMap;
2423
import java.util.Optional;
25-
import java.util.Set;
2624

27-
public class ClientProjectorRenderInfo implements IProjectorRenderInfo {
25+
public class GhostProjectorPlacementRenderer {
2826

29-
private final BlockState baseState;
30-
private final HashMap<BlockPos, Direction> remainingProjectors;
31-
private int renderTime;
27+
public static final HashMap<BlockPos, Direction> remainingProjectors= new HashMap<>(4);
3228

29+
public static int renderTime = 0;
3330

34-
public ClientProjectorRenderInfo() {
35-
this.remainingProjectors = new HashMap<>(4);
36-
this.baseState = CCBlocks.FIELD_PROJECTOR_BLOCK.get().defaultBlockState();
37-
}
31+
public static void calculateMissingProjectors(Level level, BlockPos initial) {
32+
remainingProjectors.clear();
33+
34+
final Direction initialFacing = FieldProjectorBlock.getDirection(level, initial).orElse(Direction.UP);
35+
Optional<MiniaturizationFieldSize> fieldSize = ProjectorHelper.getClosestSize(level, initial, initialFacing);
3836

39-
@Override
40-
public Set<BlockPos> getMissingProjectors() {
41-
return remainingProjectors.keySet();
37+
if (fieldSize.isPresent()) {
38+
final BlockPos center = fieldSize.get().getCenterFromProjector(initial, initialFacing);
39+
Direction.Plane.HORIZONTAL.stream()
40+
.forEach(dir -> {
41+
if (dir.getOpposite() == initialFacing) return;
42+
final BlockPos location = fieldSize.get().getProjectorLocationForDirection(center, dir);
43+
if (!(level.getBlockState(location).getBlock() instanceof FieldProjectorBlock))
44+
remainingProjectors.put(location, dir.getOpposite());
45+
});
46+
} else {
47+
ProjectorHelper.getValidOppositePositions(initial, initialFacing)
48+
.forEach(pos -> remainingProjectors.put(pos, initialFacing.getOpposite()));
49+
}
4250
}
4351

44-
@Override
45-
public int getRenderTimeLeft() {
46-
return renderTime;
52+
public static void render(PoseStack matrixStack) {
53+
final var baseState = CCBlocks.FIELD_PROJECTOR_BLOCK.get().defaultBlockState();
54+
render(matrixStack, baseState);
4755
}
4856

49-
@Override
50-
public void render(PoseStack matrixStack) {
51-
if (this.renderTime == 0) return;
52-
if (this.remainingProjectors.isEmpty()) return;
57+
public static void render(PoseStack matrixStack, BlockState baseState) {
58+
if (renderTime == 0) return;
59+
if (remainingProjectors.isEmpty()) return;
5360

5461
final Minecraft mc = Minecraft.getInstance();
5562
final MultiBufferSource.BufferSource buffers = mc.renderBuffers().bufferSource();
5663
final Camera mainCamera = mc.gameRenderer.getMainCamera();
5764
final ClientLevel level = mc.level;
5865

59-
render(matrixStack, buffers, mainCamera, level);
60-
}
61-
62-
private void render(PoseStack matrixStack, MultiBufferSource.BufferSource buffers, Camera mainCamera, ClientLevel level) {
6366
matrixStack.pushPose();
6467
Vec3 projectedView = mainCamera.getPosition();
6568
matrixStack.translate(-projectedView.x, -projectedView.y, -projectedView.z);
@@ -101,36 +104,16 @@ private void render(PoseStack matrixStack, MultiBufferSource.BufferSource buffer
101104
buffers.endBatch(CCRenderTypes.PHANTOM);
102105
}
103106

104-
@Override
105-
public void tick() {
106-
if (renderTime > 0) this.renderTime--;
107-
if (renderTime < 0) this.renderTime = 0;
107+
public static void tick() {
108+
if (renderTime > 0) renderTime--;
109+
if (renderTime < 0) renderTime = 0;
108110
}
109111

110-
@Override
111-
public void resetRenderTime() {
112-
this.renderTime = ClientConfig.placementTime;
112+
public static void resetRenderTime() {
113+
renderTime = ClientConfig.placementTime;
113114
}
114115

115-
@Override
116-
public void setProjector(Level level, BlockPos initial) {
117-
remainingProjectors.clear();
118-
119-
final Direction initialFacing = FieldProjectorBlock.getDirection(level, initial).orElse(Direction.UP);
120-
Optional<MiniaturizationFieldSize> fieldSize = ProjectorHelper.getClosestSize(level, initial, initialFacing);
121-
122-
if (fieldSize.isPresent()) {
123-
final BlockPos center = fieldSize.get().getCenterFromProjector(initial, initialFacing);
124-
Direction.Plane.HORIZONTAL.stream()
125-
.forEach(dir -> {
126-
if (dir.getOpposite() == initialFacing) return;
127-
final BlockPos location = fieldSize.get().getProjectorLocationForDirection(center, dir);
128-
if (!(level.getBlockState(location).getBlock() instanceof FieldProjectorBlock))
129-
remainingProjectors.put(location, dir.getOpposite());
130-
});
131-
} else {
132-
ProjectorHelper.getValidOppositePositions(initial, initialFacing)
133-
.forEach(pos -> this.remainingProjectors.put(pos, initialFacing.getOpposite()));
134-
}
116+
public static void setOriginProjector(Level level, BlockPos initial) {
117+
calculateMissingProjectors(level, initial);
135118
}
136119
}

neoforge-main/src/main/java/dev/compactmods/crafting/client/render/GhostRenderer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
import org.jetbrains.annotations.Nullable;
2020

2121
public class GhostRenderer {
22+
public static void renderTransparentBlock(BlockState state, @Nullable BlockPos pos, PoseStack matrix) {
23+
final var buffers = Minecraft.getInstance().renderBuffers().bufferSource();
24+
renderTransparentBlock(state, pos, matrix, buffers, 100);
25+
}
26+
2227
public static void renderTransparentBlock(BlockState state, @Nullable BlockPos pos, PoseStack matrix, MultiBufferSource buffer) {
2328
renderTransparentBlock(state, pos, matrix, buffer, 100);
2429
}

neoforge-main/src/main/java/dev/compactmods/crafting/core/CraftingCapabilities.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

neoforge-main/src/main/java/dev/compactmods/crafting/core/CreativeTabs.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dev.compactmods.crafting.CompactCrafting;
44
import net.minecraft.core.registries.BuiltInRegistries;
5+
import net.minecraft.network.chat.Component;
56
import net.minecraft.world.item.CreativeModeTab;
67
import net.minecraft.world.item.ItemStack;
78
import net.neoforged.bus.api.IEventBus;
@@ -14,6 +15,10 @@ public interface CreativeTabs {
1415

1516
DeferredHolder<CreativeModeTab, CreativeModeTab> TAB = TABS.register("main", () -> CreativeModeTab.builder()
1617
.icon(() -> new ItemStack(CCItems.FIELD_PROJECTOR_ITEM.get(), 1))
18+
.title(Component.translatable("itemGroup.compactcrafting"))
19+
.displayItems((params, out) -> {
20+
out.accept(CCItems.FIELD_PROJECTOR_ITEM.get());
21+
})
1722
.build());
1823

1924
static void init(IEventBus eventBus) {

neoforge-main/src/main/java/dev/compactmods/crafting/projector/FieldProjectorBlock.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dev.compactmods.crafting.projector;
22

33
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
4-
import dev.compactmods.crafting.core.CraftingCapabilities;
4+
import dev.compactmods.crafting.client.render.GhostProjectorPlacementRenderer;
55
import net.minecraft.core.BlockPos;
66
import net.minecraft.core.Direction;
77
import net.minecraft.server.MinecraftServer;
@@ -139,12 +139,9 @@ public static boolean isActive(BlockState state) {
139139
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) {
140140
if (world.isClientSide) {
141141
final boolean hasMissing = ProjectorHelper.getMissingProjectors(world, pos, state.getValue(FACING)).findAny().isPresent();
142-
if(hasMissing) {
143-
final var ghostRender = player.getCapability(CraftingCapabilities.GHOST_PROJECTOR_RENDER);
144-
if(ghostRender != null) {
145-
ghostRender.resetRenderTime();
146-
ghostRender.setProjector(world, pos);
147-
}
142+
if (hasMissing) {
143+
GhostProjectorPlacementRenderer.resetRenderTime();
144+
GhostProjectorPlacementRenderer.setOriginProjector(world, pos);
148145
}
149146

150147
return InteractionResult.SUCCESS;
@@ -173,6 +170,7 @@ public static void deactivateProjector(Level level, BlockPos pos) {
173170
if (currentState.getBlock() instanceof FieldProjectorBlock) {
174171
BlockState newState = currentState.setValue(SIZE, MiniaturizationFieldSize.INACTIVE);
175172
level.setBlock(pos, newState, Block.UPDATE_ALL);
173+
level.removeBlockEntity(pos);
176174
}
177175
}
178176

neoforge-main/src/main/java/dev/compactmods/crafting/projector/render/FieldProjectorRenderer.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.mojang.blaze3d.vertex.VertexConsumer;
55
import com.mojang.math.Axis;
66
import dev.compactmods.crafting.CompactCrafting;
7+
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
78
import dev.compactmods.crafting.client.ClientConfig;
89
import dev.compactmods.crafting.client.render.CCRenderTypes;
910
import dev.compactmods.crafting.client.render.CubeRenderHelper;
@@ -21,6 +22,7 @@
2122
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
2223
import net.minecraft.client.resources.model.BakedModel;
2324
import net.minecraft.client.resources.model.ModelManager;
25+
import net.minecraft.core.BlockPos;
2426
import net.minecraft.core.Direction;
2527
import net.minecraft.resources.ResourceLocation;
2628
import net.minecraft.util.FastColor;
@@ -49,21 +51,16 @@ public void render(FieldProjectorEntity tile, float partialTicks, PoseStack matr
4951

5052
renderDish(tile, matrixStack, buffers, combinedLightIn, combinedOverlayIn, gameTime);
5153

52-
// AABB bounds = tile.getField().map(field -> {
53-
// double scale = MathUtil.calculateFieldScale(field);
54-
// return field.getBounds().deflate((1 - scale) * (field.getFieldSize().getSize() / 2.0));
55-
// }).orElseGet(() -> {
56-
// BlockState state = tile.getBlockState();
57-
// final MiniaturizationFieldSize fieldSize = state.getValue(FieldProjectorBlock.SIZE);
58-
// final BlockPos center = fieldSize.getCenterFromProjector(tile.getBlockPos(), state.getValue(FieldProjectorBlock.FACING));
59-
// return fieldSize.getBoundsAtPosition(center);
60-
// });
54+
BlockState state = tile.getBlockState();
55+
final MiniaturizationFieldSize fieldSize = state.getValue(FieldProjectorBlock.SIZE);
56+
final BlockPos center = fieldSize.getCenterFromProjector(tile.getBlockPos(), state.getValue(FieldProjectorBlock.FACING));
57+
final AABB bounds = fieldSize.getBoundsAtPosition(center);
6158

6259
matrixStack.pushPose();
6360

64-
// drawScanLine(tile, matrixStack, buffers, bounds, gameTime);
65-
// drawFieldFace(tile, matrixStack, buffers, bounds);
66-
// drawProjectorArcs(tile, matrixStack, buffers, bounds, gameTime);
61+
drawScanLine(tile, matrixStack, buffers, bounds, gameTime);
62+
drawFieldFace(tile, matrixStack, buffers, bounds);
63+
drawProjectorArcs(tile, matrixStack, buffers, bounds, gameTime);
6764

6865
matrixStack.popPose();
6966
}
@@ -88,7 +85,6 @@ private void renderDish(FieldProjectorEntity te, PoseStack mx, MultiBufferSource
8885
BlockRenderDispatcher blockRenderer = Minecraft.getInstance().getBlockRenderer();
8986

9087
VertexConsumer cutoutBlocks = buffer.getBuffer(Sheets.cutoutBlockSheet());
91-
// IModelData model = ModelDataManager.getModelData(te.getLevel(), te.getBlockPos());
9288

9389
BakedModel baked = this.getModel();
9490

@@ -97,7 +93,6 @@ private void renderDish(FieldProjectorEntity te, PoseStack mx, MultiBufferSource
9793
mx.translate(.5, 0, .5);
9894

9995
double yaw = Math.sin(Math.toDegrees(gameTime) / RotationSpeed.MEDIUM.getSpeed()) * 10;
100-
// double yaw = Math.random();
10196

10297
Direction facing = state.getValue(FieldProjectorBlock.FACING);
10398
if (facing != Direction.WEST) {
@@ -222,7 +217,6 @@ private void drawFieldFace(FieldProjectorEntity tile, PoseStack mx, MultiBufferS
222217
private void drawProjectorArcs(FieldProjectorEntity tile, PoseStack mx, MultiBufferSource buffers, AABB fieldBounds, double gameTime) {
223218

224219
try {
225-
VertexConsumer builder = buffers.getBuffer(CCRenderTypes.FIELD_RENDER_TYPE);
226220

227221
Direction facing = tile.getProjectorSide();
228222

@@ -236,9 +230,7 @@ private void drawProjectorArcs(FieldProjectorEntity tile, PoseStack mx, MultiBuf
236230

237231
mx.translate(.5, .5, .5);
238232

239-
// mx.mulPose(rotation);
240-
241-
int colorProjectionArc = getProjectionColor(EnumProjectorColorType.SCAN_LINE);
233+
int colorProjectionArc = getProjectionColor(EnumProjectorColorType.FIELD);
242234

243235
Vec3 scanLeft = CubeRenderHelper.getScanLineRight(facing, fieldBounds, gameTime).subtract(tilePos);
244236
Vec3 scanRight = CubeRenderHelper.getScanLineLeft(facing, fieldBounds, gameTime).subtract(tilePos);
@@ -247,6 +239,8 @@ private void drawProjectorArcs(FieldProjectorEntity tile, PoseStack mx, MultiBuf
247239
final Matrix4f p = mx.last().pose();
248240
final Matrix3f n = mx.last().normal();
249241

242+
VertexConsumer builder = buffers.getBuffer(CCRenderTypes.FIELD_RENDER_TYPE);
243+
250244
builder.vertex(p, 0, 0.2f, 0)
251245
.color(colorProjectionArc)
252246
.normal(n, 0, 0, 0)
@@ -309,6 +303,12 @@ public boolean shouldRenderOffScreen(FieldProjectorEntity te) {
309303
return true;
310304
}
311305

306+
@Override
307+
public AABB getRenderBoundingBox(FieldProjectorEntity blockEntity) {
308+
final var p = blockEntity.getBlockPos();
309+
return AABB.encapsulatingFullBlocks(p, p).inflate(20);
310+
}
311+
312312
public int getProjectionColor(EnumProjectorColorType type) {
313313
int base = ClientConfig.projectorColor;
314314
// Color base = Color.red.brighter();

0 commit comments

Comments
 (0)