optimized lava hoarder (one block with block property instead of 2)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user