optimized lava hoarder (one block with block property instead of 2)

This commit is contained in:
Jottyfan
2026-01-02 22:41:32 +01:00
parent 7adb6c8378
commit bccb0ef8c9
11 changed files with 126 additions and 198 deletions

View File

@@ -1,125 +0,0 @@
package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
/**
*
* @author jotty
*
*/
public class EmptyLavahoarder extends Block {
public EmptyLavahoarder(Properties properties) {
super(properties);
}
@Override
protected List<ItemStack> getDrops(BlockState state, Builder params) {
List<ItemStack> list = new ArrayList<>();
list.add(new ItemStack(QuicklyBlocks.EMPTYLAVAHOARDER));
return list;
}
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
boolean found = Lavahoarder.suckLava(level, pos.north());
found = found || Lavahoarder.suckLava(level, pos.south());
found = found || Lavahoarder.suckLava(level, pos.east());
found = found || Lavahoarder.suckLava(level, pos.west());
found = found || Lavahoarder.suckLava(level, pos.above());
found = found || Lavahoarder.suckLava(level, pos.below());
if (found) {
level.setBlock(pos, QuicklyBlocks.LAVAHOARDER.defaultBlockState(), 2);
level.scheduleTick(pos, QuicklyBlocks.LAVAHOARDER, 1);
} else {
level.scheduleTick(pos, this, 1);
}
}
private static final String stringOf(BlockPos pos) {
StringBuilder buf = new StringBuilder();
buf.append(pos.getX()).append(":");
buf.append(pos.getY()).append(":");
buf.append(pos.getZ());
return buf.toString();
}
private static final BlockPos blockPosOf(String s) {
if (s.contains(":")) {
String[] parts = s.split(":");
if (parts.length > 2) {
Integer x = Integer.valueOf(parts[0]);
Integer y = Integer.valueOf(parts[1]);
Integer z = Integer.valueOf(parts[2]);
return new BlockPos(x, y, z);
} else {
return null;
}
} else {
return null;
}
}
private void findAllAttachedLavaBlocks(Set<String> list, BlockPos pos, Level level, Integer counter) {
if (counter < 1) {
return;
} else if (Blocks.LAVA.equals(level.getBlockState(pos).getBlock())) {
String p = stringOf(pos);
if (!list.contains(p)) {
list.add(p);
findAllAttachedLavaBlocks(list, pos.above(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.below(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.north(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.south(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.east(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.west(), level, counter - 1);
}
}
}
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) {
Set<String> positions = new HashSet<>();
Integer counter = 8; // TODO: make it level up - able
findAllAttachedLavaBlocks(positions, pos.above(), level, counter);
findAllAttachedLavaBlocks(positions, pos.below(), level, counter);
findAllAttachedLavaBlocks(positions, pos.north(), level, counter);
findAllAttachedLavaBlocks(positions, pos.south(), level, counter);
findAllAttachedLavaBlocks(positions, pos.east(), level, counter);
findAllAttachedLavaBlocks(positions, pos.west(), level, counter);
Integer amount = positions.size();
for (String p : positions) {
level.setBlock(blockPosOf(p), Blocks.AIR.defaultBlockState(), 2);
}
if (amount > 0) {
level.setBlock(pos, QuicklyBlocks.LAVAHOARDER.defaultBlockState(), 2);
level.scheduleTick(pos, QuicklyBlocks.LAVAHOARDER, 1);
int count = 0;
Random random = new Random();
for (int i = 0; i < amount; i++) {
if (random.nextFloat() < 0.0125) {
count++;
}
}
if (count > 0) {
Lavahoarder.spawnRandomItems(level, pos.above(), count);
}
} else {
level.scheduleTick(pos, this, 1);
}
}
}

View File

@@ -1,8 +1,10 @@
package de.jottyfan.minecraft.block;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import de.jottyfan.minecraft.item.QuicklyItems;
import net.minecraft.core.BlockPos;
@@ -18,6 +20,8 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.storage.loot.LootParams.Builder;
import net.minecraft.world.phys.BlockHitResult;
@@ -28,8 +32,16 @@ import net.minecraft.world.phys.BlockHitResult;
*/
public class Lavahoarder extends Block {
public static final BooleanProperty FILLED = BooleanProperty.create("filled");
public Lavahoarder(Properties properties) {
super(properties);
registerDefaultState(stateDefinition.any().setValue(FILLED, false));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(FILLED);
}
@Override
@@ -88,12 +100,16 @@ public class Lavahoarder extends Block {
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
suckLava(level, pos.north());
suckLava(level, pos.south());
suckLava(level, pos.east());
suckLava(level, pos.west());
suckLava(level, pos.above());
suckLava(level, pos.below());
boolean any = false;
any = any || suckLava(level, pos.north());
any = any || suckLava(level, pos.south());
any = any || suckLava(level, pos.east());
any = any || suckLava(level, pos.west());
any = any || suckLava(level, pos.above());
any = any || suckLava(level, pos.below());
if (any && !level.getBlockState(pos).getValue(Lavahoarder.FILLED)) {
level.setBlockAndUpdate(pos, QuicklyBlocks.LAVAHOARDER.defaultBlockState().setValue(Lavahoarder.FILLED, true));
}
level.scheduleTick(pos, this, 1);
}
@@ -113,15 +129,85 @@ public class Lavahoarder extends Block {
level.addFreshEntity(new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), lavaBucketStack));
}
spawnRandomItems(level, pos, 2);
level.setBlock(pos, QuicklyBlocks.EMPTYLAVAHOARDER.defaultBlockState(), 2);
level.setBlockAndUpdate(pos, QuicklyBlocks.LAVAHOARDER.defaultBlockState()); // sets filled = false
level.scheduleTick(pos, this, 1);
}
}
return InteractionResult.SUCCESS; // forbid to empty the just filled lava bucket
}
private static final String stringOf(BlockPos pos) {
StringBuilder buf = new StringBuilder();
buf.append(pos.getX()).append(":");
buf.append(pos.getY()).append(":");
buf.append(pos.getZ());
return buf.toString();
}
private void findAllAttachedLavaBlocks(Set<String> list, BlockPos pos, Level level, Integer counter) {
if (counter < 1) {
return;
} else if (Blocks.LAVA.equals(level.getBlockState(pos).getBlock())) {
String p = stringOf(pos);
if (!list.contains(p)) {
list.add(p);
findAllAttachedLavaBlocks(list, pos.above(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.below(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.north(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.south(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.east(), level, counter - 1);
findAllAttachedLavaBlocks(list, pos.west(), level, counter - 1);
}
}
}
private static final BlockPos blockPosOf(String s) {
if (s.contains(":")) {
String[] parts = s.split(":");
if (parts.length > 2) {
Integer x = Integer.valueOf(parts[0]);
Integer y = Integer.valueOf(parts[1]);
Integer z = Integer.valueOf(parts[2]);
return new BlockPos(x, y, z);
} else {
return null;
}
} else {
return null;
}
}
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) {
level.scheduleTick(pos, this, 1);
Set<String> positions = new HashSet<>();
Integer counter = 8; // TODO: make it level up - able
findAllAttachedLavaBlocks(positions, pos.above(), level, counter);
findAllAttachedLavaBlocks(positions, pos.below(), level, counter);
findAllAttachedLavaBlocks(positions, pos.north(), level, counter);
findAllAttachedLavaBlocks(positions, pos.south(), level, counter);
findAllAttachedLavaBlocks(positions, pos.east(), level, counter);
findAllAttachedLavaBlocks(positions, pos.west(), level, counter);
Integer amount = positions.size();
for (String p : positions) {
level.setBlockAndUpdate(blockPosOf(p), Blocks.AIR.defaultBlockState());
}
if (amount > 0) {
if (!level.getBlockState(pos).getValue(Lavahoarder.FILLED)) {
level.setBlockAndUpdate(pos, QuicklyBlocks.LAVAHOARDER.defaultBlockState().setValue(FILLED, true));
}
level.scheduleTick(pos, QuicklyBlocks.LAVAHOARDER, 1);
int count = 0;
Random random = new Random();
for (int i = 0; i < amount; i++) {
if (random.nextFloat() < 0.0125) {
count++;
}
}
if (count > 0) {
Lavahoarder.spawnRandomItems(level, pos.above(), count);
}
} else {
level.scheduleTick(pos, this, 1);
}
}
}

View File

@@ -41,9 +41,7 @@ public class QuicklyBlocks {
public static final Block CANOLAPLANT = registerBlock("blockcanolaplant", Properties.ofFullCopy(Blocks.WHEAT),
properties -> new BlockPlant(properties, "canolaseed", "canola"));
public static final Block LAVAHOARDER = registerBlock("lavahoarder",
Properties.of().strength(2.5f).lightLevel(_ -> 15), properties -> new Lavahoarder(properties));
public static final Block EMPTYLAVAHOARDER = registerBlock("emptylavahoarder", Properties.of().strength(2.5f),
properties -> new EmptyLavahoarder(properties));
Properties.of().strength(2.5f).lightLevel(state -> state.getValue(Lavahoarder.FILLED) ? 15 : 0), properties -> new Lavahoarder(properties));
public static final Block QUICKIEPOWDER = registerBlock("blockquickiepowder",
properties -> new BlockDrops(properties, new ItemStack(QuicklyItems.QUICKIEPOWDER, 9)));
public static final Block SPEEDPOWDER = registerBlock("blockspeedpowder",
@@ -79,9 +77,6 @@ public class QuicklyBlocks {
public static final Block SULFORBLOCK = registerBlock("blocksulfor",
properties -> new BlockOre(properties.strength(1.5f), null, new ItemStack(QuicklyItems.SULFOR, 9)));
// TODO: merge lavahoarder and emptylavahoarder into one block using a
// BooleanProperty for the lava fill state
private static final Block registerBlock(String name, Properties properties) {
return QuicklyBlocks.registerBlock(name, properties, p -> new Block(p));
}
@@ -115,11 +110,11 @@ public class QuicklyBlocks {
block.accept(OREDEEPSLATESULFOR);
block.accept(OREDEEPSLATESPEEDPOWDER);
block.accept(ORENETHERSULFOR);
block.accept(EMPTYLAVAHOARDER);
block.accept(SPEEDPOWDER);
block.accept(QUICKIEPOWDER);
block.accept(MONSTERHOARDER);
block.accept(ITEMHOARDER);
block.accept(LAVAHOARDER);
block.accept(DRILL);
block.accept(STACKER);
block.accept(SALPETERBLOCK);