feat: New grass growing logic using age

This commit is contained in:
Jakub Žitník 2025-03-14 11:44:54 +01:00
parent 1cd8648a2a
commit dd7f1c041f
Signed by: jzitnik
GPG Key ID: C577A802A6AF4EF3
4 changed files with 43 additions and 7 deletions

View File

@ -2,14 +2,18 @@ package cz.jzitnik.game.entities.items.registry.blocks;
import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.BlockRegistry;
import cz.jzitnik.game.annotations.ResetDataOnMine;
import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.entities.items.ItemType; import cz.jzitnik.game.entities.items.ItemType;
import cz.jzitnik.game.logic.services.grass.GrassDirtData;
import java.util.ArrayList; import java.util.ArrayList;
@ResetDataOnMine
@BlockRegistry("dirt") @BlockRegistry("dirt")
public class DirtBlock extends Block { public class DirtBlock extends Block {
public DirtBlock() { public DirtBlock() {
super("dirt", SpriteLoader.SPRITES.DIRT, 1, ItemType.SHOVEL, new ArrayList<>()); super("dirt", SpriteLoader.SPRITES.DIRT, 1, ItemType.SHOVEL, new ArrayList<>());
setData(new GrassDirtData());
} }
} }

View File

@ -2,14 +2,18 @@ package cz.jzitnik.game.entities.items.registry.blocks;
import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.BlockRegistry;
import cz.jzitnik.game.annotations.ResetDataOnMine;
import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.entities.items.ItemType; import cz.jzitnik.game.entities.items.ItemType;
import cz.jzitnik.game.logic.services.grass.GrassDirtData;
import java.util.ArrayList; import java.util.ArrayList;
@ResetDataOnMine
@BlockRegistry(value = "grass", drops = "dirt") @BlockRegistry(value = "grass", drops = "dirt")
public class GrassBlock extends Block { public class GrassBlock extends Block {
public GrassBlock() { public GrassBlock() {
super("grass", SpriteLoader.SPRITES.GRASS, 1, ItemType.SHOVEL, new ArrayList<>()); super("grass", SpriteLoader.SPRITES.GRASS, 1, ItemType.SHOVEL, new ArrayList<>());
setData(new GrassDirtData());
} }
} }

View File

@ -0,0 +1,16 @@
package cz.jzitnik.game.logic.services.grass;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class GrassDirtData implements Serializable {
private int age = 0;
public void increaseAge() {
age++;
}
}

View File

@ -32,17 +32,29 @@ public class GrassGrowingLogic implements CustomLogicInterface {
// Dirt // Dirt
if (world[y - 1][x].stream() if (world[y - 1][x].stream()
.allMatch(block -> block.isGhost() || block.isMob() || block.getBlockId().equals("air")) .allMatch(block -> block.isGhost() || block.isMob() || block.getBlockId().equals("air"))
&& random.nextInt(3) < 1 && isGrassBesides(world, x, y)) { && isGrassBesides(world, x, y)) {
world[y][x].removeIf(block -> block.getBlockId().equals("dirt")); var dirt = blocks.stream().filter(i -> i.getBlockId().equals("dirt")).findFirst().get();
var dirtData = (GrassDirtData) dirt.getData();
if (dirtData.getAge() == 9) {
world[y][x].remove(dirt);
world[y][x].add(ItemBlockSupplier.getBlock("grass")); world[y][x].add(ItemBlockSupplier.getBlock("grass"));
} else {
dirtData.increaseAge();
}
} }
} else if (blocks.stream().anyMatch(block -> block.getBlockId().equals("grass"))) { } else if (blocks.stream().anyMatch(block -> block.getBlockId().equals("grass"))) {
// Grass // Grass
if (!world[y - 1][x].stream() if (!world[y - 1][x].stream()
.allMatch(block -> block.isGhost() || block.isMob() || block.getBlockId().equals("air")) .allMatch(block -> block.isGhost() || block.isMob() || block.getBlockId().equals("air"))) {
&& random.nextInt(3) < 1) { var grass = blocks.stream().filter(i -> i.getBlockId().equals("grass")).findFirst().get();
world[y][x].removeIf(block -> block.getBlockId().equals("grass")); var grassData = (GrassDirtData) grass.getData();
if (grassData.getAge() == 9) {
world[y][x].remove(grass);
world[y][x].add(ItemBlockSupplier.getBlock("dirt")); world[y][x].add(ItemBlockSupplier.getBlock("dirt"));
} else {
grassData.increaseAge();
}
} }
} }
} }