Skip to content

Commit 0ae87ac

Browse files
committed
Initial impl of fake water.
Took 1 hour 1 minute
1 parent a142bf6 commit 0ae87ac

4 files changed

Lines changed: 278 additions & 3 deletions

File tree

src/main/java/org/teacon/powertool/block/PowerToolBlocks.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,36 @@
22

33
import com.mojang.datafixers.DSL;
44
import net.minecraft.MethodsReturnNonnullByDefault;
5+
import net.minecraft.core.particles.ParticleTypes;
56
import net.minecraft.core.registries.BuiltInRegistries;
67
import net.minecraft.core.registries.Registries;
78
import net.minecraft.sounds.SoundEvents;
89
import net.minecraft.world.item.BlockItem;
10+
import net.minecraft.world.item.BucketItem;
911
import net.minecraft.world.item.DyeColor;
1012
import net.minecraft.world.item.Item;
13+
import net.minecraft.world.item.Items;
1114
import net.minecraft.world.item.Rarity;
1215
import net.minecraft.world.level.block.Block;
1316
import net.minecraft.world.level.block.Blocks;
17+
import net.minecraft.world.level.block.LiquidBlock;
18+
import net.minecraft.world.level.block.PointedDripstoneBlock;
1419
import net.minecraft.world.level.block.SoundType;
1520
import net.minecraft.world.level.block.TrapDoorBlock;
1621
import net.minecraft.world.level.block.entity.BlockEntityType;
1722
import net.minecraft.world.level.block.state.BlockBehaviour;
1823
import net.minecraft.world.level.block.state.properties.BlockSetType;
24+
import net.minecraft.world.level.material.Fluid;
1925
import net.neoforged.bus.api.IEventBus;
2026
import net.neoforged.bus.api.SubscribeEvent;
2127
import net.neoforged.neoforge.capabilities.Capabilities;
2228
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
29+
import net.neoforged.neoforge.common.SoundActions;
2330
import net.neoforged.neoforge.common.util.DeferredSoundType;
31+
import net.neoforged.neoforge.fluids.FluidType;
2432
import net.neoforged.neoforge.registries.DeferredHolder;
2533
import net.neoforged.neoforge.registries.DeferredRegister;
34+
import net.neoforged.neoforge.registries.NeoForgeRegistries;
2635
import org.teacon.powertool.PowerTool;
2736
import org.teacon.powertool.block.cosmetical.CosmeticBarrel;
2837
import org.teacon.powertool.block.cosmetical.CosmeticBeehive;
@@ -47,6 +56,7 @@
4756
import org.teacon.powertool.block.entity.TempleBlockEntity;
4857
import org.teacon.powertool.block.entity.TimeObserverBlockEntity;
4958
import org.teacon.powertool.block.entity.TrashCanWithContainerBlockEntity;
59+
import org.teacon.powertool.block.fluid.FakeWater;
5060
import org.teacon.powertool.block.holo_sign.HolographicSignBlock;
5161
import org.teacon.powertool.block.holo_sign.SignType;
5262
import org.teacon.powertool.item.PowerToolDataComponents;
@@ -82,7 +92,8 @@ public class PowerToolBlocks {
8292

8393
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(Registries.BLOCK, PowerTool.MODID);
8494
public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITIES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, PowerTool.MODID);
85-
95+
public static final DeferredRegister<Fluid> FLUIDS = DeferredRegister.create(Registries.FLUID, PowerTool.MODID);
96+
public static final DeferredRegister<FluidType> FLUID_TYPES = DeferredRegister.create(NeoForgeRegistries.Keys.FLUID_TYPES, PowerTool.MODID);
8697
public static final Map<DyeColor,DeferredHolder<Block,? extends Block>> DH_CHEAT_BLOCKS = new EnumMap<>(DyeColor.class);
8798

8899
public static DeferredHolder<Block,PeriodicCommandBlock> COMMAND_BLOCK;
@@ -144,10 +155,31 @@ public class PowerToolBlocks {
144155
public static DeferredHolder<BlockEntityType<?>,BlockEntityType<TimeObserverBlockEntity>> TIME_OBSERVER_BLOCK_ENTITY;
145156
public static DeferredHolder<BlockEntityType<?>,BlockEntityType<RedStoneDelayBlockEntity>> DELAYER_BLOCK_ENTITY;
146157
public static DeferredHolder<BlockEntityType<?>,BlockEntityType<BezierCurveBlockEntity>> BEZIER_CURVE_BLOCK_ENTITY;
147-
158+
159+
public static DeferredHolder<Fluid, FakeWater> FAKE_WATER = FLUIDS.register("fake_water", FakeWater::new);
160+
public static DeferredHolder<Block, LiquidBlock> FAKE_WATER_BLOCK = BLOCKS.register("fake_water_block", () -> new LiquidBlock(
161+
FAKE_WATER.get(),
162+
BlockBehaviour.Properties.ofFullCopy(Blocks.WATER)
163+
));
164+
public static DeferredHolder<Item, BucketItem> FAKE_WATER_BUCKET = ITEMS.register("fake_water_bucket", () -> new BucketItem(FAKE_WATER.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1)));
165+
public static DeferredHolder<FluidType, FluidType> FAKE_WATER_TYPE = FLUID_TYPES.register("fake_water", () -> new FluidType(FluidType.Properties.create()
166+
.descriptionId("block.powertool.fake_water")
167+
.fallDistanceModifier(0F)
168+
.canExtinguish(true)
169+
.canConvertToSource(true)
170+
.supportsBoating(true)
171+
.sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL)
172+
.sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY)
173+
.sound(SoundActions.FLUID_VAPORIZE, SoundEvents.FIRE_EXTINGUISH)
174+
.canHydrate(true)
175+
.addDripstoneDripping(PointedDripstoneBlock.WATER_TRANSFER_PROBABILITY_PER_RANDOM_TICK, ParticleTypes.DRIPPING_DRIPSTONE_WATER, Blocks.WATER_CAULDRON, SoundEvents.POINTED_DRIPSTONE_DRIP_WATER_INTO_CAULDRON)
176+
));
177+
148178
public static void register(IEventBus bus) {
149179
BLOCKS.register(bus);
150180
BLOCK_ENTITIES.register(bus);
181+
FLUIDS.register(bus);
182+
FLUID_TYPES.register(bus);
151183
COMMAND_BLOCK = BLOCKS.register("command_block", () -> new PeriodicCommandBlock(
152184
BlockBehaviour.Properties.of().mapColor(DyeColor.PURPLE).requiresCorrectToolForDrops().strength(-1.0F, 3600000.0F).noLootTable(),
153185
false
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package org.teacon.powertool.block.fluid;
2+
3+
import net.minecraft.MethodsReturnNonnullByDefault;
4+
import net.minecraft.core.BlockPos;
5+
import net.minecraft.core.Direction;
6+
import net.minecraft.world.item.Item;
7+
import net.minecraft.world.level.BlockGetter;
8+
import net.minecraft.world.level.Level;
9+
import net.minecraft.world.level.LevelAccessor;
10+
import net.minecraft.world.level.LevelReader;
11+
import net.minecraft.world.level.block.Block;
12+
import net.minecraft.world.level.block.LiquidBlock;
13+
import net.minecraft.world.level.block.entity.BlockEntity;
14+
import net.minecraft.world.level.block.state.BlockState;
15+
import net.minecraft.world.level.block.state.StateDefinition;
16+
import net.minecraft.world.level.material.FlowingFluid;
17+
import net.minecraft.world.level.material.Fluid;
18+
import net.minecraft.world.level.material.FluidState;
19+
import net.minecraft.world.phys.Vec3;
20+
import net.neoforged.neoforge.fluids.FluidType;
21+
import org.teacon.powertool.block.PowerToolBlocks;
22+
23+
import javax.annotation.ParametersAreNonnullByDefault;
24+
25+
@ParametersAreNonnullByDefault
26+
@MethodsReturnNonnullByDefault
27+
public class FakeWater extends FlowingFluid {
28+
29+
@Override
30+
public Item getBucket() {
31+
return PowerToolBlocks.FAKE_WATER_BUCKET.get();
32+
}
33+
34+
@Override
35+
protected boolean canBeReplacedWith(FluidState state, BlockGetter level, BlockPos pos, Fluid fluid, Direction direction) {
36+
return false;
37+
}
38+
39+
@Override
40+
public Vec3 getFlow(BlockGetter blockReader, BlockPos pos, FluidState fluidState) {
41+
return Vec3.ZERO;
42+
}
43+
44+
@Override
45+
public int getTickDelay(LevelReader level) {
46+
return 5;
47+
}
48+
49+
@Override
50+
protected float getExplosionResistance() {
51+
return 100;
52+
}
53+
54+
@Override
55+
protected BlockState createLegacyBlock(FluidState state) {
56+
return PowerToolBlocks.FAKE_WATER_BLOCK.get().defaultBlockState().setValue(LiquidBlock.LEVEL, getLegacyLevel(state));
57+
}
58+
59+
@Override
60+
public boolean isSource(FluidState state) {
61+
return true;
62+
}
63+
64+
@Override
65+
public Fluid getFlowing() {
66+
return PowerToolBlocks.FAKE_WATER.get();
67+
}
68+
69+
@Override
70+
public Fluid getSource() {
71+
return PowerToolBlocks.FAKE_WATER.get();
72+
}
73+
74+
@Override
75+
protected boolean canConvertToSource(Level level) {
76+
return false;
77+
}
78+
79+
@Override
80+
protected void beforeDestroyingBlock(LevelAccessor level, BlockPos pos, BlockState state) {
81+
BlockEntity blockentity = state.hasBlockEntity() ? level.getBlockEntity(pos) : null;
82+
Block.dropResources(state, level, pos, blockentity);
83+
}
84+
85+
@Override
86+
protected int getSlopeFindDistance(LevelReader level) {
87+
return 0;
88+
}
89+
90+
@Override
91+
protected boolean canSpreadTo(BlockGetter level, BlockPos fromPos, BlockState fromBlockState, Direction direction, BlockPos toPos, BlockState toBlockState, FluidState toFluidState, Fluid fluid) {
92+
return false;
93+
}
94+
95+
@Override
96+
protected int getDropOff(LevelReader level) {
97+
return 8;
98+
}
99+
100+
@Override
101+
public int getAmount(FluidState state) {
102+
return 8;
103+
}
104+
105+
@Override
106+
protected void createFluidStateDefinition(StateDefinition.Builder<Fluid, FluidState> builder) {
107+
super.createFluidStateDefinition(builder);
108+
builder.add(LEVEL);
109+
}
110+
111+
@Override
112+
public FluidType getFluidType() {
113+
return PowerToolBlocks.FAKE_WATER_TYPE.get();
114+
}
115+
}

src/main/java/org/teacon/powertool/client/ClientEvents.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,23 @@
1010
import net.minecraft.network.chat.Component;
1111
import net.minecraft.world.item.ItemStack;
1212
import net.neoforged.api.distmarker.Dist;
13+
import net.neoforged.bus.api.EventPriority;
1314
import net.neoforged.bus.api.SubscribeEvent;
1415
import net.neoforged.fml.common.EventBusSubscriber;
1516
import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent;
1617
import net.neoforged.neoforge.client.event.ClientTickEvent;
1718
import net.neoforged.neoforge.client.event.EntityRenderersEvent;
1819
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
1920
import net.neoforged.neoforge.client.event.ScreenEvent;
21+
import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions;
22+
import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent;
23+
import net.neoforged.neoforge.common.NeoForgeMod;
2024
import org.joml.Vector2i;
2125
import org.lwjgl.glfw.GLFW;
2226
import org.teacon.powertool.PowerTool;
2327
import org.teacon.powertool.block.PowerToolBlocks;
2428
import org.teacon.powertool.block.entity.PeriodicCommandBlockEntity;
29+
import org.teacon.powertool.client.fluid.WrappedClientFluidTypeExtension;
2530
import org.teacon.powertool.client.gui.RegisterScreen;
2631
import org.teacon.powertool.client.gui.TextureExtractorScreen;
2732
import org.teacon.powertool.client.gui.TrashCanWithContainerScreen;
@@ -103,7 +108,7 @@ public static Vector2i drawRegisterInfo(Minecraft mc, GuiGraphics guiGraphics, I
103108
var ySize = yOffset + 40;
104109
return new Vector2i(xSize, ySize);
105110
}
106-
111+
107112
@SubscribeEvent
108113
static void onMousePress(ScreenEvent.MouseButtonPressed.Pre event) {
109114
event.setCanceled(AccessControlClient.INSTANCE.isDisplayModeEnabledOn(event.getScreen()));
@@ -181,5 +186,11 @@ public static void onRegModelLayerDef(EntityRenderersEvent.RegisterLayerDefiniti
181186
event.registerLayerDefinition(MartingCarEntityRenderer.getModelLayer(v), MartingCarEntityModel::createBodyLayer);
182187
}
183188
}
189+
190+
@SubscribeEvent(priority = EventPriority.LOWEST)
191+
public static void onRegClientExtensions(RegisterClientExtensionsEvent event) {
192+
event.registerFluidType(new WrappedClientFluidTypeExtension(IClientFluidTypeExtensions.of(NeoForgeMod.WATER_TYPE.value())),PowerToolBlocks.FAKE_WATER_TYPE.get());
193+
}
194+
184195
}
185196
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package org.teacon.powertool.client.fluid;
2+
3+
import com.mojang.blaze3d.shaders.FogShape;
4+
import com.mojang.blaze3d.vertex.PoseStack;
5+
import com.mojang.blaze3d.vertex.VertexConsumer;
6+
import net.minecraft.MethodsReturnNonnullByDefault;
7+
import net.minecraft.client.Camera;
8+
import net.minecraft.client.Minecraft;
9+
import net.minecraft.client.multiplayer.ClientLevel;
10+
import net.minecraft.client.renderer.FogRenderer;
11+
import net.minecraft.core.BlockPos;
12+
import net.minecraft.resources.ResourceLocation;
13+
import net.minecraft.world.level.BlockAndTintGetter;
14+
import net.minecraft.world.level.block.state.BlockState;
15+
import net.minecraft.world.level.material.FluidState;
16+
import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions;
17+
import net.neoforged.neoforge.fluids.FluidStack;
18+
import org.jetbrains.annotations.Nullable;
19+
import org.joml.Vector3f;
20+
21+
import javax.annotation.ParametersAreNonnullByDefault;
22+
23+
@ParametersAreNonnullByDefault
24+
@MethodsReturnNonnullByDefault
25+
public class WrappedClientFluidTypeExtension implements IClientFluidTypeExtensions {
26+
27+
private final IClientFluidTypeExtensions delegate;
28+
29+
public WrappedClientFluidTypeExtension(IClientFluidTypeExtensions delegate) {
30+
this.delegate = delegate;
31+
}
32+
33+
@Override
34+
public int getTintColor() {
35+
return delegate.getTintColor();
36+
}
37+
38+
@Override
39+
public ResourceLocation getStillTexture() {
40+
return delegate.getStillTexture();
41+
}
42+
43+
@Override
44+
public ResourceLocation getFlowingTexture() {
45+
return delegate.getFlowingTexture();
46+
}
47+
48+
@Override
49+
public @Nullable ResourceLocation getOverlayTexture() {
50+
return delegate.getOverlayTexture();
51+
}
52+
53+
@Override
54+
public @Nullable ResourceLocation getRenderOverlayTexture(Minecraft mc) {
55+
return delegate.getRenderOverlayTexture(mc);
56+
}
57+
58+
@Override
59+
public void renderOverlay(Minecraft mc, PoseStack poseStack) {
60+
delegate.renderOverlay(mc, poseStack);
61+
}
62+
63+
@Override
64+
public Vector3f modifyFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, Vector3f fluidFogColor) {
65+
return delegate.modifyFogColor(camera, partialTick, level, renderDistance, darkenWorldAmount, fluidFogColor);
66+
}
67+
68+
@Override
69+
public void modifyFogRender(Camera camera, FogRenderer.FogMode mode, float renderDistance, float partialTick, float nearDistance, float farDistance, FogShape shape) {
70+
delegate.modifyFogRender(camera, mode, renderDistance, partialTick, nearDistance, farDistance, shape);
71+
}
72+
73+
@Override
74+
public ResourceLocation getStillTexture(FluidState state, BlockAndTintGetter getter, BlockPos pos) {
75+
return delegate.getStillTexture(state, getter, pos);
76+
}
77+
78+
@Override
79+
public ResourceLocation getFlowingTexture(FluidState state, BlockAndTintGetter getter, BlockPos pos) {
80+
return delegate.getFlowingTexture(state, getter, pos);
81+
}
82+
83+
@Override
84+
public ResourceLocation getOverlayTexture(FluidState state, BlockAndTintGetter getter, BlockPos pos) {
85+
return delegate.getOverlayTexture(state, getter, pos);
86+
}
87+
88+
@Override
89+
public int getTintColor(FluidState state, BlockAndTintGetter getter, BlockPos pos) {
90+
return delegate.getTintColor(state, getter, pos);
91+
}
92+
93+
@Override
94+
public int getTintColor(FluidStack stack) {
95+
return delegate.getTintColor(stack);
96+
}
97+
98+
@Override
99+
public ResourceLocation getStillTexture(FluidStack stack) {
100+
return delegate.getStillTexture(stack);
101+
}
102+
103+
@Override
104+
public ResourceLocation getFlowingTexture(FluidStack stack) {
105+
return delegate.getFlowingTexture(stack);
106+
}
107+
108+
@Override
109+
public ResourceLocation getOverlayTexture(FluidStack stack) {
110+
return delegate.getOverlayTexture(stack);
111+
}
112+
113+
@Override
114+
public boolean renderFluid(FluidState fluidState, BlockAndTintGetter getter, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState) {
115+
return delegate.renderFluid(fluidState, getter, pos, vertexConsumer, blockState);
116+
}
117+
}

0 commit comments

Comments
 (0)