Skip to content

Commit 5e1936b

Browse files
committed
Rewrite block registration in Java
1 parent 622d17a commit 5e1936b

31 files changed

+716
-651
lines changed

common/src/main/java/juuxel/adorn/block/AdornBlockEntities.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ public final class AdornBlockEntities {
2929
public static final Registered<BlockEntityType<KitchenSinkBlockEntity>> KITCHEN_SINK =
3030
register("kitchen_sink", PlatformBridges.Companion.getBlockEntities()::createKitchenSink, KitchenSinkBlock.class);
3131
public static final Registered<BlockEntityType<TradingStationBlockEntity>> TRADING_STATION =
32-
register("trading_station", TradingStationBlockEntity::new, AdornBlocks.INSTANCE::getTRADING_STATION);
32+
register("trading_station", TradingStationBlockEntity::new, AdornBlocks.TRADING_STATION);
3333
public static final Registered<BlockEntityType<BrewerBlockEntity>> BREWER =
34-
register("brewer", PlatformBridges.Companion.getBlockEntities()::createBrewer, AdornBlocks.INSTANCE::getBREWER);
34+
register("brewer", PlatformBridges.Companion.getBlockEntities()::createBrewer, AdornBlocks.BREWER);
3535

3636
private static <E extends BlockEntity> Registered<BlockEntityType<E>> register(String name, BlockEntityFactory<E> factory, Supplier<? extends Block> block) {
3737
return BLOCK_ENTITIES.register(name, () -> BlockEntityType.Builder.create(factory, block.get()).build(null));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
package juuxel.adorn.block;
2+
3+
import juuxel.adorn.block.variant.BlockVariant;
4+
import juuxel.adorn.item.TradingStationItem;
5+
import juuxel.adorn.lib.AdornSounds;
6+
import juuxel.adorn.lib.registry.Registered;
7+
import juuxel.adorn.lib.registry.Registrar;
8+
import juuxel.adorn.lib.registry.RegistrarFactory;
9+
import juuxel.adorn.lib.registry.RegistryHelper;
10+
import juuxel.adorn.platform.PlatformBridges;
11+
import juuxel.adorn.util.ExtensionsKt;
12+
import net.minecraft.block.AbstractBlock;
13+
import net.minecraft.block.Block;
14+
import net.minecraft.block.Blocks;
15+
import net.minecraft.block.MapColor;
16+
import net.minecraft.block.Oxidizable;
17+
import net.minecraft.block.TorchBlock;
18+
import net.minecraft.block.WallTorchBlock;
19+
import net.minecraft.item.Item;
20+
import net.minecraft.particle.ParticleTypes;
21+
import net.minecraft.registry.RegistryKeys;
22+
import net.minecraft.sound.BlockSoundGroup;
23+
import net.minecraft.util.DyeColor;
24+
25+
import java.util.Map;
26+
27+
public final class AdornBlocks {
28+
public static final Registrar<Block> BLOCKS = RegistrarFactory.get().create(RegistryKeys.BLOCK);
29+
public static final Registrar<Item> ITEMS = RegistrarFactory.get().create(RegistryKeys.ITEM);
30+
private static final RegistryHelper HELPER = new RegistryHelper(BLOCKS, ITEMS);
31+
32+
public static final Registered<Map<DyeColor, SofaBlock>> SOFAS = ExtensionsKt.associateLazily(
33+
DyeColor.values(),
34+
color -> HELPER.registerBlock(
35+
color.asString() + "_sofa",
36+
() -> PlatformBridges.Companion.getBlockFactory().createSofa(BlockVariant.wool(color))
37+
)
38+
);
39+
40+
public static final Registered<Block> BRICK_CHIMNEY = HELPER.registerBlock("brick_chimney",
41+
() -> new ChimneyBlock(AbstractChimneyBlock.createBlockSettings(MapColor.RED)));
42+
public static final Registered<Block> STONE_BRICK_CHIMNEY = HELPER.registerBlock("stone_brick_chimney",
43+
() -> new ChimneyBlock(AbstractChimneyBlock.createBlockSettings(MapColor.STONE_GRAY)));
44+
public static final Registered<Block> NETHER_BRICK_CHIMNEY = HELPER.registerBlock("nether_brick_chimney",
45+
() -> new ChimneyBlock(AbstractChimneyBlock.createBlockSettings(MapColor.DARK_RED)));
46+
public static final Registered<Block> RED_NETHER_BRICK_CHIMNEY = HELPER.registerBlock("red_nether_brick_chimney",
47+
() -> new ChimneyBlock(AbstractChimneyBlock.createBlockSettings(MapColor.DARK_RED)));
48+
public static final Registered<Block> COBBLESTONE_CHIMNEY = HELPER.registerBlock("cobblestone_chimney",
49+
() -> new ChimneyBlock(AbstractChimneyBlock.createBlockSettings(MapColor.STONE_GRAY)));
50+
public static final Registered<Block> PRISMARINE_CHIMNEY = HELPER.registerBlock("prismarine_chimney",
51+
() -> new PrismarineChimneyBlock(AbstractChimneyBlock.createBlockSettings(MapColor.CYAN, 1.5f)));
52+
public static final Registered<Block> MAGMATIC_PRISMARINE_CHIMNEY = HELPER.registerBlock("magmatic_prismarine_chimney",
53+
() -> new PrismarineChimneyBlock.WithColumn(true, AbstractChimneyBlock.createBlockSettings(MapColor.CYAN, 1.5f).luminance(state -> 3)));
54+
public static final Registered<Block> SOULFUL_PRISMARINE_CHIMNEY = HELPER.registerBlock("soulful_prismarine_chimney",
55+
() -> new PrismarineChimneyBlock.WithColumn(false, AbstractChimneyBlock.createBlockSettings(MapColor.CYAN, 1.5f)));
56+
57+
public static final Registered<Map<DyeColor, Block>> TABLE_LAMPS = ExtensionsKt.associateLazily(
58+
DyeColor.values(),
59+
color -> HELPER.registerBlock(color.asString() + "_table_lamp", () -> new TableLampBlock(TableLampBlock.createBlockSettings(color)))
60+
);
61+
62+
public static final Registered<Block> TRADING_STATION = HELPER.registerBlock(
63+
"trading_station",
64+
block -> new TradingStationItem(block, new Item.Settings()),
65+
() -> new TradingStationBlock(AbstractBlock.Settings.create().mapColor(MapColor.GREEN).strength(2.5f).sounds(BlockSoundGroup.WOOD))
66+
);
67+
68+
public static final Registered<Block> STONE_TORCH_GROUND = HELPER.registerBlockWithoutItem("stone_torch",
69+
() -> new TorchBlock(
70+
ParticleTypes.FLAME,
71+
AbstractBlock.Settings.copy(Blocks.TORCH)
72+
.sounds(BlockSoundGroup.STONE)
73+
.luminance(state -> 15)
74+
));
75+
76+
public static final Registered<Block> STONE_TORCH_WALL = HELPER.registerBlockWithoutItem("wall_stone_torch",
77+
() -> new WallTorchBlock(
78+
ParticleTypes.FLAME,
79+
AbstractBlock.Settings.copy(STONE_TORCH_GROUND.get()).dropsLike(STONE_TORCH_GROUND.get())
80+
));
81+
82+
public static final Registered<Block> CRATE = HELPER.registerBlock("crate",
83+
() -> new Block(ExtensionsKt.copySettingsSafely(Blocks.OAK_PLANKS)));
84+
public static final Registered<Block> APPLE_CRATE = registerCrate("apple_crate");
85+
public static final Registered<Block> WHEAT_CRATE = registerCrate("wheat_crate");
86+
public static final Registered<Block> CARROT_CRATE = registerCrate("carrot_crate");
87+
public static final Registered<Block> POTATO_CRATE = registerCrate("potato_crate");
88+
public static final Registered<Block> MELON_CRATE = registerCrate("melon_crate");
89+
public static final Registered<Block> WHEAT_SEED_CRATE = registerCrate("wheat_seed_crate");
90+
public static final Registered<Block> MELON_SEED_CRATE = registerCrate("melon_seed_crate");
91+
public static final Registered<Block> PUMPKIN_SEED_CRATE = registerCrate("pumpkin_seed_crate");
92+
public static final Registered<Block> BEETROOT_CRATE = registerCrate("beetroot_crate");
93+
public static final Registered<Block> BEETROOT_SEED_CRATE = registerCrate("beetroot_seed_crate");
94+
public static final Registered<Block> SWEET_BERRY_CRATE = registerCrate("sweet_berry_crate");
95+
public static final Registered<Block> COCOA_BEAN_CRATE = registerCrate("cocoa_bean_crate");
96+
public static final Registered<Block> NETHER_WART_CRATE = registerCrate("nether_wart_crate");
97+
public static final Registered<Block> SUGAR_CANE_CRATE = registerCrate("sugar_cane_crate");
98+
public static final Registered<Block> EGG_CRATE = registerCrate("egg_crate");
99+
public static final Registered<Block> HONEYCOMB_CRATE = registerCrate("honeycomb_crate");
100+
public static final Registered<Block> LIL_TATER_CRATE = registerCrate("lil_tater_crate");
101+
102+
public static final Registered<Block> PICKET_FENCE = HELPER.registerBlock("picket_fence",
103+
() -> new PicketFenceBlock(AbstractBlock.Settings.copy(Blocks.OAK_FENCE).nonOpaque()));
104+
public static final Registered<Block> CHAIN_LINK_FENCE = HELPER.registerBlock("chain_link_fence",
105+
() -> new ChainLinkFenceBlock(
106+
AbstractBlock.Settings.copy(Blocks.IRON_BARS)
107+
.sounds(AdornSounds.CHAIN_LINK_FENCE)
108+
));
109+
public static final Registered<Block> STONE_LADDER = HELPER.registerBlock("stone_ladder",
110+
() -> new StoneLadderBlock(AbstractBlock.Settings.copy(Blocks.STONE).nonOpaque()));
111+
public static final Registered<Block> BREWER = HELPER.registerBlock("brewer",
112+
() -> new BrewerBlock(
113+
AbstractBlock.Settings.create()
114+
.mapColor(MapColor.DEEPSLATE_GRAY)
115+
.solid()
116+
.strength(0.8F)
117+
.requiresTool()
118+
));
119+
120+
public static final Registered<Block> CANDLELIT_LANTERN = HELPER.registerBlock("candlelit_lantern",
121+
() -> new CandlelitLanternBlock(CandlelitLanternBlock.createBlockSettings()));
122+
public static final Registered<Map<DyeColor, Block>> DYED_CANDLELIT_LANTERNS = ExtensionsKt.associateLazily(
123+
DyeColor.values(),
124+
color -> HELPER.registerBlock(
125+
color.asString() + "_candlelit_lantern",
126+
() -> new CandlelitLanternBlock(CandlelitLanternBlock.createBlockSettings())
127+
)
128+
);
129+
130+
public static final Registered<Block> COPPER_PIPE = HELPER.registerBlock("copper_pipe",
131+
() -> new OxidizableCopperPipeBlock(
132+
Oxidizable.OxidationLevel.UNAFFECTED,
133+
AbstractBlock.Settings.create()
134+
.requiresTool()
135+
.strength(3f, 5f)
136+
.sounds(BlockSoundGroup.COPPER)
137+
.mapColor(MapColor.ORANGE)
138+
));
139+
public static final Registered<Block> EXPOSED_COPPER_PIPE = HELPER.registerBlock("exposed_copper_pipe",
140+
() -> new OxidizableCopperPipeBlock(
141+
Oxidizable.OxidationLevel.EXPOSED,
142+
AbstractBlock.Settings.create()
143+
.requiresTool()
144+
.strength(3f, 5f)
145+
.sounds(BlockSoundGroup.COPPER)
146+
.mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)
147+
));
148+
public static final Registered<Block> WEATHERED_COPPER_PIPE = HELPER.registerBlock("weathered_copper_pipe",
149+
() -> new OxidizableCopperPipeBlock(
150+
Oxidizable.OxidationLevel.WEATHERED,
151+
AbstractBlock.Settings.create()
152+
.requiresTool()
153+
.strength(3f, 5f)
154+
.sounds(BlockSoundGroup.COPPER)
155+
.mapColor(MapColor.DARK_AQUA)
156+
));
157+
public static final Registered<Block> OXIDIZED_COPPER_PIPE = HELPER.registerBlock("oxidized_copper_pipe",
158+
() -> new OxidizableCopperPipeBlock(
159+
Oxidizable.OxidationLevel.OXIDIZED,
160+
AbstractBlock.Settings.create()
161+
.requiresTool()
162+
.strength(3f, 5f)
163+
.sounds(BlockSoundGroup.COPPER)
164+
.mapColor(MapColor.TEAL)
165+
));
166+
public static final Registered<Block> WAXED_COPPER_PIPE = HELPER.registerBlock("waxed_copper_pipe",
167+
() -> new CopperPipeBlock(AbstractBlock.Settings.copy(COPPER_PIPE.get())));
168+
public static final Registered<Block> WAXED_EXPOSED_COPPER_PIPE = HELPER.registerBlock("waxed_exposed_copper_pipe",
169+
() -> new CopperPipeBlock(AbstractBlock.Settings.copy(EXPOSED_COPPER_PIPE.get())));
170+
public static final Registered<Block> WAXED_WEATHERED_COPPER_PIPE = HELPER.registerBlock("waxed_weathered_copper_pipe",
171+
() -> new CopperPipeBlock(AbstractBlock.Settings.copy(WEATHERED_COPPER_PIPE.get())));
172+
public static final Registered<Block> WAXED_OXIDIZED_COPPER_PIPE = HELPER.registerBlock("waxed_oxidized_copper_pipe",
173+
() -> new CopperPipeBlock(AbstractBlock.Settings.copy(OXIDIZED_COPPER_PIPE.get())));
174+
175+
public static void init() {
176+
}
177+
178+
private static Registered<Block> registerCrate(String name) {
179+
return HELPER.registerBlock(name, () -> new Item.Settings().recipeRemainder(CRATE.get().asItem()), () -> new Block(ExtensionsKt.copySettingsSafely(CRATE.get())));
180+
}
181+
}

common/src/main/java/juuxel/adorn/block/SofaBlock.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public String getDescriptionKey() {
7777
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
7878
var stack = player.getStackInHand(hand);
7979
if (stack.getItem() instanceof DyeItem dye) {
80-
world.setBlockState(pos, AdornBlocks.INSTANCE.getSOFAS().get(dye.getColor()).getStateWithProperties(state));
80+
world.setBlockState(pos, AdornBlocks.SOFAS.get().get(dye.getColor()).getStateWithProperties(state));
8181
world.playSound(player, pos, SoundEvents.BLOCK_WOOL_PLACE, SoundCategory.BLOCKS, 1f, 0.8f);
8282
if (!player.getAbilities().creativeMode) stack.decrement(1);
8383
if (!world.isClient) player.incrementStat(AdornStats.DYE_SOFA);

common/src/main/java/juuxel/adorn/block/TableLampBlock.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ protected void appendProperties(StateManager.Builder<Block, BlockState> builder)
7373
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
7474
var stack = player.getStackInHand(hand);
7575
if (stack.getItem() instanceof DyeItem dye) {
76-
world.setBlockState(pos, AdornBlocks.INSTANCE.getTABLE_LAMPS().get(dye.getColor()).getStateWithProperties(state));
76+
world.setBlockState(pos, AdornBlocks.TABLE_LAMPS.get().get(dye.getColor()).getStateWithProperties(state));
7777
world.playSound(player, pos, SoundEvents.BLOCK_WOOL_PLACE, SoundCategory.BLOCKS, 1f, 0.8f);
7878
if (!player.getAbilities().creativeMode) stack.decrement(1);
7979
if (!world.isClient) player.incrementStat(AdornStats.DYE_TABLE_LAMP);

common/src/main/kotlin/juuxel/adorn/block/variant/BlockKind.kt common/src/main/java/juuxel/adorn/block/variant/BlockKind.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package juuxel.adorn.block.variant
1+
package juuxel.adorn.block.variant;
22

3-
enum class BlockKind {
3+
public enum BlockKind {
44
CHAIR,
55
TABLE,
66
DRAWER,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package juuxel.adorn.block.variant;
2+
3+
import juuxel.adorn.util.ExtensionsKt;
4+
import net.minecraft.block.AbstractBlock;
5+
import net.minecraft.block.Block;
6+
import net.minecraft.block.Blocks;
7+
import net.minecraft.util.DyeColor;
8+
import net.minecraft.util.Identifier;
9+
10+
import java.util.Arrays;
11+
import java.util.Collections;
12+
import java.util.EnumMap;
13+
import java.util.Map;
14+
import java.util.stream.Collectors;
15+
16+
public interface BlockVariant {
17+
char MOD_ID_SEPARATOR = '/';
18+
19+
Map<DyeColor, BlockVariant> WOOLS = Collections.unmodifiableMap(
20+
new EnumMap<DyeColor, BlockVariant>(
21+
Arrays.stream(DyeColor.values())
22+
.map(color -> Map.entry(color, variant(color.asString(), Blocks.WHITE_WOOL)))
23+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))
24+
)
25+
);
26+
27+
BlockVariant IRON = variant("iron", Blocks.IRON_BARS);
28+
BlockVariant OAK = variant("oak", Blocks.OAK_PLANKS);
29+
BlockVariant SPRUCE = variant("spruce", Blocks.SPRUCE_PLANKS);
30+
BlockVariant BIRCH = variant("birch", Blocks.BIRCH_PLANKS);
31+
BlockVariant JUNGLE = variant("jungle", Blocks.JUNGLE_PLANKS);
32+
BlockVariant ACACIA = variant("acacia", Blocks.ACACIA_PLANKS);
33+
BlockVariant DARK_OAK = variant("dark_oak", Blocks.DARK_OAK_PLANKS);
34+
BlockVariant MANGROVE = variant("mangrove", Blocks.MANGROVE_PLANKS);
35+
BlockVariant CHERRY = variant("cherry", Blocks.CHERRY_PLANKS);
36+
BlockVariant BAMBOO = variant("bamboo", Blocks.BAMBOO_PLANKS);
37+
BlockVariant CRIMSON = variant("crimson", Blocks.CRIMSON_PLANKS);
38+
BlockVariant WARPED = variant("warped", Blocks.WARPED_PLANKS);
39+
BlockVariant STONE = variant("stone", Blocks.STONE);
40+
BlockVariant COBBLESTONE = variant("cobblestone", Blocks.COBBLESTONE);
41+
BlockVariant SANDSTONE = variant("sandstone", Blocks.SANDSTONE);
42+
BlockVariant DIORITE = variant("diorite", Blocks.DIORITE);
43+
BlockVariant ANDESITE = variant("andesite", Blocks.ANDESITE);
44+
BlockVariant GRANITE = variant("granite", Blocks.GRANITE);
45+
BlockVariant BRICK = variant("brick", Blocks.BRICKS);
46+
BlockVariant STONE_BRICK = variant("stone_brick", Blocks.STONE_BRICKS);
47+
BlockVariant RED_SANDSTONE = variant("red_sandstone", Blocks.RED_SANDSTONE);
48+
BlockVariant NETHER_BRICK = variant("nether_brick", Blocks.NETHER_BRICKS);
49+
BlockVariant BASALT = variant("basalt", Blocks.BASALT);
50+
BlockVariant BLACKSTONE = variant("blackstone", Blocks.BLACKSTONE);
51+
BlockVariant RED_NETHER_BRICK = variant("red_nether_brick", Blocks.RED_NETHER_BRICKS);
52+
BlockVariant PRISMARINE = variant("prismarine", Blocks.PRISMARINE);
53+
BlockVariant QUARTZ = variant("quartz", Blocks.QUARTZ_BLOCK);
54+
BlockVariant END_STONE_BRICK = variant("end_stone_brick", Blocks.END_STONE_BRICKS);
55+
BlockVariant PURPUR = variant("purpur", Blocks.PURPUR_BLOCK);
56+
BlockVariant POLISHED_BLACKSTONE = variant("polished_blackstone", Blocks.POLISHED_BLACKSTONE);
57+
BlockVariant POLISHED_BLACKSTONE_BRICK = variant("polished_blackstone_brick", Blocks.POLISHED_BLACKSTONE_BRICKS);
58+
BlockVariant POLISHED_DIORITE = variant("polished_diorite", Blocks.POLISHED_DIORITE);
59+
BlockVariant POLISHED_ANDESITE = variant("polished_andesite", Blocks.POLISHED_ANDESITE);
60+
BlockVariant POLISHED_GRANITE = variant("polished_granite", Blocks.POLISHED_GRANITE);
61+
BlockVariant PRISMARINE_BRICK = variant("prismarine_brick", Blocks.PRISMARINE_BRICKS);
62+
BlockVariant DARK_PRISMARINE = variant("dark_prismarine", Blocks.DARK_PRISMARINE);
63+
BlockVariant CUT_SANDSTONE = variant("cut_sandstone", Blocks.CUT_SANDSTONE);
64+
BlockVariant SMOOTH_SANDSTONE = variant("smooth_sandstone", Blocks.SMOOTH_SANDSTONE);
65+
BlockVariant CUT_RED_SANDSTONE = variant("cut_red_sandstone", Blocks.CUT_RED_SANDSTONE);
66+
BlockVariant SMOOTH_RED_SANDSTONE = variant("smooth_red_sandstone", Blocks.SMOOTH_RED_SANDSTONE);
67+
BlockVariant SMOOTH_STONE = variant("smooth_stone", Blocks.SMOOTH_STONE);
68+
BlockVariant MOSSY_COBBLESTONE = variant("mossy_cobblestone", Blocks.MOSSY_COBBLESTONE);
69+
BlockVariant MOSSY_STONE_BRICK = variant("mossy_stone_brick", Blocks.MOSSY_STONE_BRICKS);
70+
BlockVariant DEEPSLATE = variant("deepslate", Blocks.DEEPSLATE);
71+
BlockVariant COBBLED_DEEPSLATE = variant("cobbled_deepslate", Blocks.COBBLED_DEEPSLATE);
72+
BlockVariant POLISHED_DEEPSLATE = variant("polished_deepslate", Blocks.POLISHED_DEEPSLATE);
73+
BlockVariant DEEPSLATE_BRICK = variant("deepslate_brick", Blocks.DEEPSLATE_BRICKS);
74+
BlockVariant DEEPSLATE_TILE = variant("deepslate_tile", Blocks.DEEPSLATE_TILES);
75+
76+
/**
77+
* The name of this variant. Must be a valid identifier path.
78+
*/
79+
String name();
80+
81+
default Identifier nameAsIdentifier() {
82+
var name = this.name();
83+
var separatorIndex = name.indexOf(MOD_ID_SEPARATOR);
84+
if (separatorIndex >= 0) {
85+
return new Identifier(name.substring(0, separatorIndex), name.substring(separatorIndex + 1));
86+
} else {
87+
return new Identifier(Identifier.DEFAULT_NAMESPACE, name);
88+
}
89+
}
90+
91+
/**
92+
* Creates a <em>new</em> {@code AbstractBlock.Settings}.
93+
*/
94+
AbstractBlock.Settings createSettings();
95+
96+
static BlockVariant variant(String name, Block base) {
97+
return new BlockVariant() {
98+
@Override
99+
public String name() {
100+
return name;
101+
}
102+
103+
@Override
104+
public AbstractBlock.Settings createSettings() {
105+
return ExtensionsKt.copySettingsSafely(base);
106+
}
107+
};
108+
}
109+
110+
static BlockVariant wool(DyeColor color) {
111+
return WOOLS.get(color);
112+
}
113+
114+
record Wood(String name) implements BlockVariant {
115+
@Override
116+
public AbstractBlock.Settings createSettings() {
117+
return ExtensionsKt.copySettingsSafely(Blocks.OAK_PLANKS);
118+
}
119+
}
120+
121+
record Stone(String name) implements BlockVariant {
122+
@Override
123+
public AbstractBlock.Settings createSettings() {
124+
return ExtensionsKt.copySettingsSafely(Blocks.COBBLESTONE);
125+
}
126+
}
127+
}

0 commit comments

Comments
 (0)