Skip to content

Commit 41ec0e2

Browse files
committed
Added flux capacitor block
1 parent 8f0ad9e commit 41ec0e2

30 files changed

+1402
-174
lines changed

LICENSE

Lines changed: 674 additions & 121 deletions
Large diffs are not rendered by default.

src/main/java/net/limit/cubliminal/CubliminalClient.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
88
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
99
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
10+
import net.limit.cubliminal.client.CubliminalRenderLayers;
1011
import net.limit.cubliminal.client.hud.NoClippingHudOverlay;
1112
import net.limit.cubliminal.client.hud.SanityBarHudOverlay;
13+
import net.limit.cubliminal.client.render.FluxCapacitorRenderer;
1214
import net.limit.cubliminal.client.render.ManilaGatewayRenderer;
1315
import net.limit.cubliminal.entity.client.SeatRenderer;
1416
import net.limit.cubliminal.event.KeyInputHandler;
@@ -23,22 +25,6 @@
2325
@Environment(EnvType.CLIENT)
2426
public class CubliminalClient implements ClientModInitializer {
2527

26-
public static final ShaderProgramKey RENDERTYPE_CUBLIMINAL_MANILA_SKYBOX = ShaderProgramKeys.register("rendertype_cubliminal_manila_skybox", VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL);
27-
28-
public static final RenderPhase.ShaderProgram MANILA_PROGRAM = new RenderPhase.ShaderProgram(RENDERTYPE_CUBLIMINAL_MANILA_SKYBOX);
29-
30-
public static final RenderLayer MANILA = RenderLayer.of("manila", VertexFormats.POSITION,
31-
VertexFormat.DrawMode.QUADS, 1536, false, false,
32-
RenderLayer.MultiPhaseParameters.builder().program(MANILA_PROGRAM).texture(
33-
RenderPhase.Textures.create()
34-
.add(Cubliminal.id("textures/sky/manila_" + 0 + ".png"), false, false)
35-
.add(Cubliminal.id("textures/sky/manila_" + 1 + ".png"), false, false)
36-
.add(Cubliminal.id("textures/sky/manila_" + 2 + ".png"), false, false)
37-
.add(Cubliminal.id("textures/sky/manila_" + 3 + ".png"), false, false)
38-
.add(Cubliminal.id("textures/sky/manila_" + 4 + ".png"), false, false)
39-
.add(Cubliminal.id("textures/sky/manila_" + 5 + ".png"), false, false)
40-
.build()).build(false));
41-
4228
@Override
4329
public void onInitializeClient() {
4430
BlockRenderLayerMap.INSTANCE.putBlock(CubliminalBlocks.THE_LOBBY_GATEWAY_BLOCK, RenderLayer.getCutout());
@@ -48,15 +34,19 @@ public void onInitializeClient() {
4834
CubliminalBlocks.MOLD,
4935
CubliminalBlocks.JUMBLED_DOCUMENTS,
5036
CubliminalBlocks.EXIT_SIGN,
51-
CubliminalBlocks.SMOKE_DETECTOR);
37+
CubliminalBlocks.SMOKE_DETECTOR,
38+
CubliminalBlocks.FLUX_CAPACITOR);
5239

5340
BlockEntityRendererFactories.register(CubliminalBlockEntities.THE_LOBBY_GATEWAY_BLOCK_ENTITY, ManilaGatewayRenderer::new);
41+
BlockEntityRendererFactories.register(CubliminalBlockEntities.FLUX_CAPACITOR_BLOCK_ENTITY, FluxCapacitorRenderer::new);
5442

5543
KeyInputHandler.register();
5644

5745
EntityRendererRegistry
5846
.register(CubliminalEntities.SEAT_ENTITY, SeatRenderer::new);
5947

48+
CubliminalRenderLayers.init();
49+
6050

6151
ClientPlayNetworking.registerGlobalReceiver(CubliminalPackets.NoClipSyncPayload.ID, (payload, context) -> {
6252
ClientPlayerEntity player = context.player();
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package net.limit.cubliminal.block.custom;
2+
3+
import com.mojang.serialization.MapCodec;
4+
import net.limit.cubliminal.block.entity.FluxCapacitorBlockEntity;
5+
import net.limit.cubliminal.init.CubliminalBlockEntities;
6+
import net.limit.cubliminal.init.CubliminalSounds;
7+
import net.minecraft.block.*;
8+
import net.minecraft.block.entity.BlockEntity;
9+
import net.minecraft.block.entity.BlockEntityTicker;
10+
import net.minecraft.block.entity.BlockEntityType;
11+
import net.minecraft.item.ItemPlacementContext;
12+
import net.minecraft.sound.SoundCategory;
13+
import net.minecraft.state.StateManager;
14+
import net.minecraft.state.property.BooleanProperty;
15+
import net.minecraft.state.property.EnumProperty;
16+
import net.minecraft.state.property.Properties;
17+
import net.minecraft.util.math.BlockPos;
18+
import net.minecraft.util.math.Direction;
19+
import net.minecraft.world.World;
20+
import net.minecraft.world.WorldAccess;
21+
import net.minecraft.world.block.WireOrientation;
22+
import org.jetbrains.annotations.Nullable;
23+
24+
public class FluxCapacitorBlock extends BlockWithEntity implements BlockEntityProvider {
25+
public static final MapCodec<FluxCapacitorBlock> CODEC = FluxCapacitorBlock.createCodec(FluxCapacitorBlock::new);
26+
public static final BooleanProperty POWERED = Properties.POWERED;
27+
public static final EnumProperty<Direction> FACING = HorizontalFacingBlock.FACING;
28+
public FluxCapacitorBlock(Settings settings) {
29+
super(settings);
30+
this.setDefaultState(this.stateManager.getDefaultState().with(POWERED, false).with(FACING, Direction.NORTH));
31+
}
32+
33+
@Override
34+
protected MapCodec<? extends BlockWithEntity> getCodec() {
35+
return CODEC;
36+
}
37+
38+
@Nullable
39+
@Override
40+
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
41+
return new FluxCapacitorBlockEntity(pos, state);
42+
}
43+
44+
@Override
45+
public BlockRenderType getRenderType(BlockState state) {
46+
return BlockRenderType.MODEL;
47+
}
48+
49+
@Nullable
50+
@Override
51+
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(World world, BlockState state, BlockEntityType<T> type) {
52+
return validateTicker(type, CubliminalBlockEntities.FLUX_CAPACITOR_BLOCK_ENTITY, FluxCapacitorBlockEntity::tick);
53+
}
54+
55+
@Override
56+
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
57+
builder.add(POWERED, FACING);
58+
}
59+
60+
@Nullable
61+
@Override
62+
public BlockState getPlacementState(ItemPlacementContext ctx) {
63+
return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite())
64+
.with(POWERED, shouldBePowered(ctx.getWorld(), ctx.getBlockPos()));
65+
}
66+
67+
@Override
68+
protected void neighborUpdate(BlockState state, World world, BlockPos pos, Block sourceBlock, @Nullable WireOrientation wireOrientation, boolean notify) {
69+
if (shouldBePowered(world, pos)) {
70+
world.setBlockState(pos, state.with(POWERED, true));
71+
}
72+
}
73+
74+
protected boolean shouldBePowered(World world, BlockPos pos) {
75+
return world.isReceivingRedstonePower(pos) && world.getBlockState(pos.up())
76+
.equals(Blocks.LIGHTNING_ROD.getDefaultState().with(LightningRodBlock.POWERED, true));
77+
}
78+
79+
@Override
80+
public void onBroken(WorldAccess world, BlockPos pos, BlockState state) {
81+
if (!world.isClient()) {
82+
CubliminalSounds.clientStopSound(world.getServer().getOverworld().getPlayers(),
83+
SoundCategory.BLOCKS, CubliminalSounds.FLUX_CAPACITOR.value().id());
84+
}
85+
}
86+
}

src/main/java/net/limit/cubliminal/block/custom/SinkBlock.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import net.minecraft.entity.player.PlayerEntity;
1212
import net.minecraft.item.ItemPlacementContext;
1313
import net.minecraft.particle.ParticleTypes;
14-
import net.minecraft.sound.SoundCategory;
1514
import net.minecraft.state.StateManager;
1615
import net.minecraft.state.property.BooleanProperty;
1716
import net.minecraft.state.property.EnumProperty;
@@ -27,7 +26,6 @@
2726
import net.minecraft.util.shape.VoxelShapes;
2827
import net.minecraft.world.BlockView;
2928
import net.minecraft.world.World;
30-
import net.minecraft.world.WorldAccess;
3129
import net.minecraft.world.WorldView;
3230
import net.minecraft.world.tick.ScheduledTickView;
3331
import org.jetbrains.annotations.Nullable;
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package net.limit.cubliminal.block.entity;
2+
3+
import net.limit.cubliminal.block.custom.FluxCapacitorBlock;
4+
import net.limit.cubliminal.client.hud.NoClippingHudOverlay;
5+
import net.limit.cubliminal.init.CubliminalBlockEntities;
6+
import net.limit.cubliminal.init.CubliminalSounds;
7+
import net.limit.cubliminal.util.NoClipEngine;
8+
import net.minecraft.block.Block;
9+
import net.minecraft.block.BlockState;
10+
import net.minecraft.block.entity.BlockEntity;
11+
import net.minecraft.client.MinecraftClient;
12+
import net.minecraft.entity.Entity;
13+
import net.minecraft.entity.player.PlayerEntity;
14+
import net.minecraft.nbt.NbtCompound;
15+
import net.minecraft.predicate.entity.EntityPredicates;
16+
import net.minecraft.registry.RegistryWrapper;
17+
import net.minecraft.sound.SoundCategory;
18+
import net.minecraft.util.math.BlockPos;
19+
import net.minecraft.util.math.Direction;
20+
import net.minecraft.world.World;
21+
22+
import java.util.function.Predicate;
23+
24+
public class FluxCapacitorBlockEntity extends BlockEntity {
25+
26+
public FluxCapacitorBlockEntity(BlockPos pos, BlockState state) {
27+
super(CubliminalBlockEntities.FLUX_CAPACITOR_BLOCK_ENTITY, pos, state);
28+
}
29+
30+
private boolean canBreakReality;
31+
private int realityTicks;
32+
33+
34+
@Override
35+
protected void writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
36+
super.writeNbt(nbt, registryLookup);
37+
nbt.putInt("RealityTicks", this.realityTicks);
38+
}
39+
40+
@Override
41+
protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
42+
super.readNbt(nbt, registryLookup);
43+
this.realityTicks = nbt.getInt("RealityTicks");
44+
}
45+
46+
47+
public static void tick(World world, BlockPos pos, BlockState state, FluxCapacitorBlockEntity entity) {
48+
if (state.get(FluxCapacitorBlock.POWERED) && !entity.canBreakReality) {
49+
entity.canBreakReality = true;
50+
world.playSoundAtBlockCenter(pos, CubliminalSounds.FLUX_CAPACITOR.value(),
51+
SoundCategory.BLOCKS, 1.0f, 1.0f, false);
52+
}
53+
if (entity.canBreakReality) {
54+
entity.breakReality(world, state);
55+
}
56+
}
57+
58+
59+
@Override
60+
public boolean onSyncedBlockEvent(int type, int data) {
61+
if (type == 1) {
62+
return true;
63+
} else return super.onSyncedBlockEvent(type, data);
64+
}
65+
66+
public void breakReality(World world, BlockState state) {
67+
if (this.realityTicks > 279) {
68+
world.setBlockState(pos, state.with(FluxCapacitorBlock.POWERED, false));
69+
this.canBreakReality = false;
70+
this.realityTicks = 0;
71+
} else {
72+
++this.realityTicks;
73+
if (this.realityTicks == 220) {
74+
if (world.isClient) {
75+
NoClippingHudOverlay.INSTANCE.setAux_renderOverlay(false);
76+
} else {
77+
for (PlayerEntity player : world.getPlayers().stream().filter(Predicate.not(PlayerEntity::isSpectator)).toList()) {
78+
NoClipEngine.noClip(player);
79+
}
80+
}
81+
} else if (world.isClient && this.realityTicks == 100 &&
82+
!MinecraftClient.getInstance().player.isSpectator()) {
83+
NoClippingHudOverlay.INSTANCE.setAux_renderOverlay(true);
84+
}
85+
}
86+
}
87+
88+
public int getRealityTicks() {
89+
return this.realityTicks;
90+
}
91+
92+
public boolean canBreakReality() {
93+
return this.canBreakReality;
94+
}
95+
96+
@Override
97+
public NbtCompound toInitialChunkDataNbt(RegistryWrapper.WrapperLookup registryLookup) {
98+
return this.createNbt(registryLookup);
99+
}
100+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package net.limit.cubliminal.client;
2+
3+
import net.fabricmc.api.EnvType;
4+
import net.fabricmc.api.Environment;
5+
import net.limit.cubliminal.Cubliminal;
6+
import net.minecraft.client.gl.ShaderProgramKey;
7+
import net.minecraft.client.gl.ShaderProgramKeys;
8+
import net.minecraft.client.render.RenderLayer;
9+
import net.minecraft.client.render.RenderPhase;
10+
import net.minecraft.client.render.VertexFormat;
11+
import net.minecraft.client.render.VertexFormats;
12+
13+
@Environment(EnvType.CLIENT)
14+
public class CubliminalRenderLayers {
15+
public static final ShaderProgramKey RENDERTYPE_CUBLIMINAL_MANILA_SKYBOX = ShaderProgramKeys.register("rendertype_cubliminal_manila_skybox", VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL);
16+
17+
public static final RenderPhase.ShaderProgram MANILA_PROGRAM = new RenderPhase.ShaderProgram(RENDERTYPE_CUBLIMINAL_MANILA_SKYBOX);
18+
19+
public static final RenderLayer MANILA = RenderLayer.of("manila", VertexFormats.POSITION,
20+
VertexFormat.DrawMode.QUADS, 1536, false, false,
21+
RenderLayer.MultiPhaseParameters.builder().program(MANILA_PROGRAM).texture(
22+
RenderPhase.Textures.create()
23+
.add(Cubliminal.id("textures/sky/manila_" + 0 + ".png"), false, false)
24+
.add(Cubliminal.id("textures/sky/manila_" + 1 + ".png"), false, false)
25+
.add(Cubliminal.id("textures/sky/manila_" + 2 + ".png"), false, false)
26+
.add(Cubliminal.id("textures/sky/manila_" + 3 + ".png"), false, false)
27+
.add(Cubliminal.id("textures/sky/manila_" + 4 + ".png"), false, false)
28+
.add(Cubliminal.id("textures/sky/manila_" + 5 + ".png"), false, false)
29+
.build()).build(false));
30+
31+
32+
public static final ShaderProgramKey RENDERTYPE_BLOOM_DOT = ShaderProgramKeys.register("rendertype_bloom_dot", VertexFormats.POSITION_COLOR);
33+
34+
public static final RenderPhase.ShaderProgram BLOOM_PROGRAM = new RenderPhase.ShaderProgram(RENDERTYPE_BLOOM_DOT);
35+
36+
public static final RenderLayer BLOOM = RenderLayer.of("bloom", VertexFormats.POSITION_COLOR_LIGHT,
37+
VertexFormat.DrawMode.QUADS, 1536, false, false,
38+
RenderLayer.MultiPhaseParameters.builder().program(BLOOM_PROGRAM).build(false));
39+
40+
41+
public static void init() {
42+
}
43+
}

src/main/java/net/limit/cubliminal/client/hud/NoClippingHudOverlay.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class NoClippingHudOverlay implements HudRenderCallback {
2121

2222
public static NoClippingHudOverlay INSTANCE = new NoClippingHudOverlay();
2323
private boolean clippingIntoWall = false;
24+
private boolean aux_renderOverlay = false;
2425

2526
private static final Identifier GLITCH_OVERLAY_1 = Cubliminal.id("textures/hud/noclip/glitch_overlay_1.png");
2627
private static final Identifier GLITCH_OVERLAY_2 = Cubliminal.id("textures/hud/noclip/glitch_overlay_2.png");
@@ -48,7 +49,7 @@ public void onHudRender(DrawContext drawContext, RenderTickCounter tickCounter)
4849
break;
4950
}
5051
}
51-
} else if (this.clippingIntoWall) {
52+
} else if (this.clippingIntoWall || this.aux_renderOverlay) {
5253
for (int i = 0; i < 2; i++) {
5354
if ((player.getWorld().getTime() + i) % 6 == 0) {
5455
Random random = player.getRandom();
@@ -96,4 +97,8 @@ public boolean isClippingIntoWall() {
9697
public void setClippingIntoWall(boolean clippingIntoWall) {
9798
this.clippingIntoWall = clippingIntoWall;
9899
}
100+
101+
public void setAux_renderOverlay(boolean aux_renderOverlay) {
102+
this.aux_renderOverlay = aux_renderOverlay;
103+
}
99104
}

0 commit comments

Comments
 (0)