Skip to content

Commit 9b34dca

Browse files
feature: add different block handler implementations (#51)
* Add block module * Add readme file * Add different implementation of block handlers * Add lantern package * Add test for the lantern block handler creation * Work on the loader part * Add package-info file * Remove public keyword * Remove import * Add more block handlers * Add block module * Add more handler options * chore(java): update used version to 25 * chore(block): work on more block handlers * chore(block): add usage of the block module * chore(block): more block handling stuff * chore(block): finish constructor definition --------- Co-authored-by: theEvilReaper <theEvilReaper@users.noreply.github.com>
1 parent d780d76 commit 9b34dca

32 files changed

Lines changed: 857 additions & 1 deletion

block/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# 🧱 Block Module
2+
3+
This module provides a collection of **block handlers** for different block types.
4+
5+
> [!CAUTION]
6+
> This module is **data-only**.
7+
> It loads and registers block states but does **not** implement placement, interaction, or gameplay logic.
8+
> Such behavior must be handled in other modules.
9+
10+
> [!NOTE]
11+
> This module is designed to be **extensible**.
12+
> Additional block handlers and state definitions can be implemented as needed, without altering the existing structure.

block/build.gradle.kts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
plugins {
2+
`java-library`
3+
}
4+
5+
group = "net.theevilreaper"
6+
version = "0.0.1"
7+
8+
java {
9+
toolchain {
10+
languageVersion.set(JavaLanguageVersion.of(25))
11+
}
12+
}
13+
14+
dependencies {
15+
implementation(platform(libs.mycelium.bom))
16+
compileOnly(libs.minestom)
17+
18+
testImplementation(libs.minestom)
19+
testImplementation(libs.cyano)
20+
testImplementation(libs.junit.api)
21+
testImplementation(libs.junit.params)
22+
testImplementation(libs.junit.platform.launcher)
23+
testRuntimeOnly(libs.junit.engine)
24+
}
25+
26+
tasks {
27+
test {
28+
jvmArgs("-Dminestom.inside-test=true")
29+
useJUnitPlatform()
30+
testLogging {
31+
events("passed", "skipped", "failed")
32+
}
33+
}
34+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package net.theevilreaper.bounce.block;
2+
3+
import net.minestom.server.instance.block.BlockManager;
4+
import org.jetbrains.annotations.Contract;
5+
6+
import net.theevilreaper.bounce.block.type.lantern.LanternBlockFactory.Type;
7+
8+
public sealed interface BlockLoader permits BlockLoaderBuilder {
9+
10+
/**
11+
* Creates a new {@link BlockLoaderBuilder} for the specified block manager.
12+
*
13+
* @param blockManager the block manager to use
14+
* @return a new {@link BlockLoaderBuilder} instance
15+
*/
16+
@Contract(value = "_ -> new", pure = true)
17+
static BlockLoader builder(BlockManager blockManager) {
18+
return new BlockLoaderBuilder(blockManager);
19+
}
20+
21+
BlockLoader torch();
22+
23+
BlockLoader fenceGate();
24+
25+
/**
26+
* Registers a new torch variant.
27+
*
28+
* @param type the type of the torch variant
29+
* @return this builder instance for chaining
30+
*/
31+
BlockLoader lanternVariant(Type type);
32+
33+
/**
34+
* Registers a new head variant.
35+
*
36+
* @return this builder instance for chaining
37+
*/
38+
BlockLoader playerHead();
39+
40+
/**
41+
* Registers a new wall head variant.
42+
*
43+
* @return this builder instance for chaining
44+
*/
45+
BlockLoader playerWallHead();
46+
47+
/**
48+
* Registers a new barrel variant.
49+
*
50+
* @return this builder instance for chaining
51+
*/
52+
BlockLoader barrel();
53+
54+
/**
55+
* Registers a new iron bars variant.
56+
*
57+
* @return this builder instance for chaining
58+
*/
59+
BlockLoader ironBars();
60+
61+
/**
62+
* Registers a new grindstone variant.
63+
*
64+
* @return this builder instance for chaining
65+
*/
66+
BlockLoader grindStone();
67+
68+
BlockLoader candle();
69+
70+
BlockLoader ironChain();
71+
72+
BlockLoader stairs();
73+
74+
BlockLoader slab();
75+
76+
BlockLoader flowerPot();
77+
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package net.theevilreaper.bounce.block;
2+
3+
import net.minestom.server.instance.block.Block;
4+
import net.minestom.server.instance.block.BlockHandler;
5+
import net.minestom.server.instance.block.BlockManager;
6+
import net.theevilreaper.bounce.block.type.BambooPotBlockHandler;
7+
import net.theevilreaper.bounce.block.type.BarrelBlockHandler;
8+
import net.theevilreaper.bounce.block.type.CandleBlockHandler;
9+
import net.theevilreaper.bounce.block.type.GrindstoneBlockHandler;
10+
import net.theevilreaper.bounce.block.type.IronChainBlockHandler;
11+
import net.theevilreaper.bounce.block.type.SlabBlockHandler;
12+
import net.theevilreaper.bounce.block.type.TorchBlockHandler;
13+
import net.theevilreaper.bounce.block.type.gates.GateBlockHandler;
14+
import net.theevilreaper.bounce.block.type.grates.IronGrateBlockHandler;
15+
import net.theevilreaper.bounce.block.type.lantern.LanternBlockFactory;
16+
import net.theevilreaper.bounce.block.type.player.PlayerHeadBlockHandler;
17+
import net.theevilreaper.bounce.block.type.player.PlayerWallHeadBlockHandler;
18+
import net.theevilreaper.bounce.block.type.stairs.StairsBlockHandler;
19+
20+
public final class BlockLoaderBuilder implements BlockLoader {
21+
22+
private final BlockManager blockManager;
23+
24+
BlockLoaderBuilder(BlockManager blockManager) {
25+
this.blockManager = blockManager;
26+
}
27+
28+
/**
29+
* {@inheritDoc}
30+
*/
31+
@Override
32+
public BlockLoader lanternVariant(LanternBlockFactory.Type type) {
33+
blockManager.registerHandler(type.getBlock().key(), () -> LanternBlockFactory.create(type));
34+
return this;
35+
}
36+
37+
/**
38+
* {@inheritDoc}
39+
*/
40+
@Override
41+
public BlockLoader playerHead() {
42+
BlockHandler blockHandler = new PlayerHeadBlockHandler();
43+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
44+
return this;
45+
}
46+
47+
/**
48+
* {@inheritDoc}
49+
*/
50+
@Override
51+
public BlockLoader playerWallHead() {
52+
BlockHandler blockHandler = new PlayerWallHeadBlockHandler();
53+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
54+
return this;
55+
}
56+
57+
/**
58+
* {@inheritDoc}
59+
*/
60+
@Override
61+
public BlockLoader barrel() {
62+
BlockHandler blockHandler = new BarrelBlockHandler();
63+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
64+
return this;
65+
}
66+
67+
/**
68+
* {@inheritDoc}
69+
*/
70+
@Override
71+
public BlockLoader ironBars() {
72+
BlockHandler blockHandler = new IronGrateBlockHandler();
73+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
74+
return this;
75+
}
76+
77+
/**
78+
* {@inheritDoc}
79+
*/
80+
@Override
81+
public BlockLoader grindStone() {
82+
BlockHandler blockHandler = new GrindstoneBlockHandler();
83+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
84+
return this;
85+
}
86+
87+
@Override
88+
public BlockLoader ironChain() {
89+
BlockHandler blockHandler = new IronChainBlockHandler();
90+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
91+
return this;
92+
}
93+
94+
@Override
95+
public BlockLoader stairs() {
96+
blockManager.registerHandler(Block.OAK_STAIRS.key(), () -> new StairsBlockHandler(Block.OAK_STAIRS));
97+
blockManager.registerHandler(Block.SPRUCE_STAIRS.key(), () -> new StairsBlockHandler(Block.OAK_STAIRS));
98+
blockManager.registerHandler(Block.PALE_OAK_STAIRS.key(), () -> new StairsBlockHandler(Block.OAK_STAIRS));
99+
return this;
100+
}
101+
102+
@Override
103+
public BlockLoader candle() {
104+
BlockHandler blockHandler = new CandleBlockHandler(Block.RED_CANDLE.key());
105+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
106+
return this;
107+
}
108+
109+
@Override
110+
public BlockLoader torch() {
111+
BlockHandler blockHandler = new TorchBlockHandler();
112+
blockManager.registerHandler(blockHandler.getKey(), () -> blockHandler);
113+
return this;
114+
}
115+
116+
@Override
117+
public BlockLoader fenceGate() {
118+
blockManager.registerHandler(Block.OAK_FENCE_GATE.key(), () -> new GateBlockHandler(Block.OAK_PLANKS.key()));
119+
blockManager.registerHandler(Block.BIRCH_FENCE_GATE.key(), () -> new GateBlockHandler(Block.OAK_PLANKS.key()));
120+
blockManager.registerHandler(Block.SPRUCE_FENCE_GATE.key(), () -> new GateBlockHandler(Block.OAK_PLANKS.key()));
121+
blockManager.registerHandler(Block.JUNGLE_FENCE_GATE.key(), () -> new GateBlockHandler(Block.OAK_PLANKS.key()));
122+
blockManager.registerHandler(Block.ACACIA_FENCE_GATE.key(), () -> new GateBlockHandler(Block.OAK_PLANKS.key()));
123+
blockManager.registerHandler(Block.PALE_OAK_FENCE_GATE.key(), () -> new GateBlockHandler(Block.OAK_PLANKS.key()));
124+
return this;
125+
}
126+
127+
@Override
128+
public BlockLoader slab() {
129+
blockManager.registerHandler(
130+
Block.OAK_SLAB.key(), () -> new SlabBlockHandler(Block.OAK_SLAB.key())
131+
);
132+
blockManager.registerHandler(
133+
Block.OAK_SLAB.key(), () -> new SlabBlockHandler(Block.SPRUCE_SLAB.key())
134+
);
135+
blockManager.registerHandler(
136+
Block.OAK_SLAB.key(), () -> new SlabBlockHandler(Block.WARPED_SLAB.key())
137+
);
138+
return this;
139+
140+
}
141+
142+
@Override
143+
public BlockLoader flowerPot() {
144+
blockManager.registerHandler(Block.POTTED_BAMBOO.key(), BambooPotBlockHandler::new);
145+
return this;
146+
}
147+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@NotNullByDefault
2+
package net.theevilreaper.bounce.block;
3+
4+
import org.jetbrains.annotations.NotNullByDefault;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.theevilreaper.bounce.block.type;
2+
3+
import net.kyori.adventure.key.Key;
4+
import net.minestom.server.instance.block.Block;
5+
import net.minestom.server.instance.block.BlockHandler;
6+
import net.minestom.server.tag.Tag;
7+
8+
import java.util.Collection;
9+
import java.util.List;
10+
11+
public class BambooPotBlockHandler implements BlockHandler {
12+
@Override
13+
public Key getKey() {
14+
return Block.POTTED_BAMBOO.key();
15+
}
16+
17+
@Override
18+
public Collection<Tag<?>> getBlockEntityTags() {
19+
return List.of(
20+
Tag.Integer("rotating")
21+
);
22+
}
23+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.theevilreaper.bounce.block.type;
2+
3+
import net.kyori.adventure.key.Key;
4+
import net.minestom.server.instance.block.Block;
5+
import net.minestom.server.instance.block.BlockHandler;
6+
import net.minestom.server.tag.Tag;
7+
8+
import java.util.Collection;
9+
import java.util.List;
10+
11+
public class BarrelBlockHandler implements BlockHandler {
12+
13+
@Override
14+
public Key getKey() {
15+
return Block.BARREL.key();
16+
}
17+
18+
@Override
19+
public Collection<Tag<?>> getBlockEntityTags() {
20+
return List.of(
21+
Tag.String("facing"),
22+
Tag.Boolean("open")
23+
);
24+
}
25+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package net.theevilreaper.bounce.block.type;
2+
3+
import net.kyori.adventure.key.Key;
4+
import net.minestom.server.instance.block.BlockHandler;
5+
import net.minestom.server.tag.Tag;
6+
7+
import java.util.Collection;
8+
import java.util.List;
9+
10+
public class CandleBlockHandler implements BlockHandler {
11+
12+
private final Key key;
13+
14+
public CandleBlockHandler(Key key) {
15+
this.key = key;
16+
}
17+
18+
@Override
19+
public Key getKey() {
20+
return this.key;
21+
}
22+
23+
@Override
24+
public Collection<Tag<?>> getBlockEntityTags() {
25+
return List.of(
26+
Tag.Integer("candles"),
27+
Tag.Boolean("lit"),
28+
Tag.Boolean("waterlogged")
29+
);
30+
}
31+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.theevilreaper.bounce.block.type;
2+
3+
import net.kyori.adventure.key.Key;
4+
import net.minestom.server.instance.block.Block;
5+
import net.minestom.server.instance.block.BlockHandler;
6+
import net.minestom.server.tag.Tag;
7+
8+
import java.util.Collection;
9+
import java.util.List;
10+
11+
public class GrindstoneBlockHandler implements BlockHandler {
12+
13+
@Override
14+
public Key getKey() {
15+
return Block.GRINDSTONE.key();
16+
}
17+
18+
@Override
19+
public Collection<Tag<?>> getBlockEntityTags() {
20+
return List.of(
21+
Tag.String("face"),
22+
Tag.String("facing")
23+
);
24+
}
25+
}

0 commit comments

Comments
 (0)