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) {
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);

View File

@@ -1,7 +0,0 @@
{
"variants": {
"": {
"model": "quickly:block/emptylavahoarder"
}
}
}

View File

@@ -1,7 +1,6 @@
{
"variants": {
"": {
"model": "quickly:block/lavahoarder"
}
"filled=true": { "model": "quickly:block/lavahoarder" },
"filled=false": { "model": "quickly:block/emptylavahoarder" }
}
}

View File

@@ -1,6 +0,0 @@
{
"model": {
"type": "minecraft:model",
"model": "quickly:block/emptylavahoarder"
}
}

View File

@@ -1,6 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "quickly:block/lavahoarder"
"model": "quickly:block/emptylavahoarder"
}
}

View File

@@ -1,17 +1,4 @@
{
"item.quickly.speedpowderaxe": "Fluchtpulveraxt",
"item.quickly.speedpowderpickaxe": "Fluchtpulverspitzhacke",
"item.quickly.speedpowdershovel": "Fluchtpulverschaufel",
"item.quickly.speedpowderhoe": "Fluchtpulverfeldhacke",
"item.quickly.speedpowderwaterhoe": "bewässerte Fluchtpulverfeldhacke",
"item.quickly.speedpowdershears": "Fluchtpulverschere",
"item.quickly.quickiepowderaxe": "Eilpulveraxt",
"item.quickly.quickiepowderpickaxe": "Eilpulverspitzhacke",
"item.quickly.quickiepowdershovel": "Eilpulverschaufel",
"item.quickly.quickiepowderhoe": "Eilpulverfeldhacke",
"item.quickly.quickiepowderwaterhoe": "bewässerte Eilpulverfeldhacke",
"item.quickly.quickiepowdershears": "Eilpulverschere",
"info.block.drillfuel": "Ladung: %s Bohrungen",
"info.block.itemhoarder": "enthält: %s",
"info.block.monsterhoarder": "Radius: %s, Brenndauer: %s Ticks",
@@ -36,10 +23,9 @@
"item.quickly.cottonseed": "Baumwollsaat",
"item.quickly.dirtsalpeter": "Salpetererde",
"item.quickly.drill": "Bohrer",
"item.quickly.emptylavahoarder": "Lavasauger",
"item.quickly.itemhoarder": "Itemsauger",
"item.quickly.kelpbundle": "Seegrassbündel",
"item.quickly.lavahoarder": "voller Lavasauger",
"item.quickly.lavahoarder": "Lavasauger",
"item.quickly.magnifier": "Lupe",
"item.quickly.monsterhoarder": "Monstersauger",
"item.quickly.oredeepslatespeedpowder": "Eilpulvertiefengesteinerz",
@@ -54,12 +40,24 @@
"item.quickly.oxidizedcopperpowder": "oxidiertes Kupferpulver",
"item.quickly.quickieingot": "Eilpulverbarren",
"item.quickly.quickiepowder": "Eilpulver",
"item.quickly.quickiepowderaxe": "Eilaxt",
"item.quickly.quickiepowderpickaxe": "Eilspitzhacke",
"item.quickly.quickiepowdershovel": "Eilschaufel",
"item.quickly.quickiepowderhoe": "Eilfeldhacke",
"item.quickly.quickiepowdershears": "Eilschere",
"item.quickly.quickiepowderwaterhoe": "bewässerte Eilfeldhacke",
"item.quickly.rawturquoise": "rohes Türkis",
"item.quickly.rotten_flesh_stripes": "geschnittenes Gammelfleisch",
"item.quickly.salpeter": "Salpeter",
"item.quickly.sandsalpeter": "Salpetersand",
"item.quickly.speedingot": "Fluchtpulverbarren",
"item.quickly.speedpowder": "Fluchtpulver",
"item.quickly.speedpowderaxe": "Fluchtaxt",
"item.quickly.speedpowderpickaxe": "Fluchtspitzhacke",
"item.quickly.speedpowdershovel": "Fluchtschaufel",
"item.quickly.speedpowderhoe": "Fluchtfeldhacke",
"item.quickly.speedpowdershears": "Fluchtschere",
"item.quickly.speedpowderwaterhoe": "bewässerte Fluchtfeldhacke",
"item.quickly.stub": "Stummel",
"item.quickly.sulfor": "Schwefel",
"item.quickly.turquoise_boots": "Türkisschuhe",

View File

@@ -1,17 +1,4 @@
{
"item.quickly.speedpowderaxe": "speedpowder axe",
"item.quickly.speedpowderpickaxe": "speedpowder pickaxe",
"item.quickly.speedpowdershovel": "speedpowder shovel",
"item.quickly.speedpowderhoe": "speedpowder hoe",
"item.quickly.speedpowderwaterhoe": "watered speedpowder hoe",
"item.quickly.speedpowdershears": "speedpowder shears",
"item.quickly.quickiepowderaxe": "hurrypowder axe",
"item.quickly.quickiepowderpickaxe": "hurrypowder pickaxe",
"item.quickly.quickiepowdershovel": "hurrypowder shovel",
"item.quickly.quickiepowderhoe": "hurrypowder hoe",
"item.quickly.quickiepowderwaterhoe": "watered hurrypowder hoe",
"item.quickly.quickiepowdershears": "hurrypowder shears",
"info.block.drillfuel": "Load: %s drills",
"info.block.itemhoarder": "contains: %s",
"info.block.monsterhoarder": "radius: %s, burn ticks: %s",
@@ -36,10 +23,9 @@
"item.quickly.cottonseed": "cotton seed",
"item.quickly.dirtsalpeter": "salpeter dirt",
"item.quickly.drill": "drill",
"item.quickly.emptylavahoarder": "lava hoarder",
"item.quickly.itemhoarder": "item hoarder",
"item.quickly.kelpbundle": "kelp bundle",
"item.quickly.lavahoarder": "filled lava hoarder",
"item.quickly.lavahoarder": "lava hoarder",
"item.quickly.magnifier": "magnifier",
"item.quickly.monsterhoarder": "monster hoarder",
"item.quickly.oredeepslatespeedpowder": "speed poweder deepslate ore",
@@ -54,12 +40,24 @@
"item.quickly.oxidizedcopperpowder": "oxidized copper powder",
"item.quickly.quickieingot": "quickie powder ingot",
"item.quickly.quickiepowder": "quickie powder",
"item.quickly.quickiepowderaxe": "hurry axe",
"item.quickly.quickiepowderhoe": "hurry hoe",
"item.quickly.quickiepowderpickaxe": "hurry pickaxe",
"item.quickly.quickiepowdershears": "hurry shears",
"item.quickly.quickiepowdershovel": "hurry shovel",
"item.quickly.quickiepowderwaterhoe": "watered hurry hoe",
"item.quickly.rawturquoise": "raw turquoise",
"item.quickly.rotten_flesh_stripes": "rotton flesh stripes",
"item.quickly.salpeter": "salpeter",
"item.quickly.sandsalpeter": "salpeter sand",
"item.quickly.speedingot": "speed powder ingot",
"item.quickly.speedpowder": "speed powder",
"item.quickly.speedpowderaxe": "speed axe",
"item.quickly.speedpowderhoe": "speed hoe",
"item.quickly.speedpowderpickaxe": "speed pickaxe",
"item.quickly.speedpowdershears": "speed shears",
"item.quickly.speedpowdershovel": "speed shovel",
"item.quickly.speedpowderwaterhoe": "watered speed hoe",
"item.quickly.stub": "stub",
"item.quickly.sulfor": "sulfor",
"item.quickly.turquoise_boots": "turquoise boots",

View File

@@ -1,10 +0,0 @@
{
"parent": "quickly:block/emptylavahoarder",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@@ -11,7 +11,7 @@
"b": "minecraft:bucket"
},
"result": {
"id": "quickly:emptylavahoarder",
"id": "quickly:lavahoarder",
"count": 1
}
}