From 32cb96dd494b196e5d56aa9ae2ee7d4fa0cb1909 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Sat, 20 Sep 2025 15:46:39 +0200 Subject: [PATCH] feat: Zombies fall when block is broken under them --- .../CustomMobFallingAfterMineLogic.java | 15 +++++++++ ...CustomMobFallingAfterMineLogicHandler.java | 7 +++++ .../entities/items/registry/mobs/Zombie.java | 3 ++ .../jzitnik/game/generation/Generation.java | 2 ++ .../events/handlers/mobs/MobMineHandler.java | 24 ++++++++++++-- .../zombie/ZombieFallingAfterMineLogic.java | 31 +++++++++++++++++++ .../mobs/services/zombie/ZombieLogic.java | 3 ++ 7 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cz/jzitnik/game/annotations/CustomMobFallingAfterMineLogic.java create mode 100644 src/main/java/cz/jzitnik/game/core/CustomMobFallingAfterMineLogicHandler.java create mode 100644 src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieFallingAfterMineLogic.java diff --git a/src/main/java/cz/jzitnik/game/annotations/CustomMobFallingAfterMineLogic.java b/src/main/java/cz/jzitnik/game/annotations/CustomMobFallingAfterMineLogic.java new file mode 100644 index 0000000..2165abd --- /dev/null +++ b/src/main/java/cz/jzitnik/game/annotations/CustomMobFallingAfterMineLogic.java @@ -0,0 +1,15 @@ +package cz.jzitnik.game.annotations; + +import cz.jzitnik.game.core.CustomMobFallingAfterMineLogicHandler; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@RequireAnnotation(BlockRegistry.class) +public @interface CustomMobFallingAfterMineLogic { + Class value(); +} diff --git a/src/main/java/cz/jzitnik/game/core/CustomMobFallingAfterMineLogicHandler.java b/src/main/java/cz/jzitnik/game/core/CustomMobFallingAfterMineLogicHandler.java new file mode 100644 index 0000000..ebb4c60 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/core/CustomMobFallingAfterMineLogicHandler.java @@ -0,0 +1,7 @@ +package cz.jzitnik.game.core; + +import cz.jzitnik.game.Game; + +public interface CustomMobFallingAfterMineLogicHandler { + void handle(Game game, int x, int y); +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java b/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java index 60b00c0..c292e66 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java @@ -1,10 +1,13 @@ package cz.jzitnik.game.entities.items.registry.mobs; import cz.jzitnik.game.SpriteLoader; +import cz.jzitnik.game.annotations.CustomMobFallingAfterMineLogic; import cz.jzitnik.game.annotations.EntityRegistry; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.mobs.services.zombie.ZombieData; +import cz.jzitnik.game.mobs.services.zombie.ZombieFallingAfterMineLogic; +@CustomMobFallingAfterMineLogic(ZombieFallingAfterMineLogic.class) @EntityRegistry("zombie") public class Zombie extends Block { public Zombie() { diff --git a/src/main/java/cz/jzitnik/game/generation/Generation.java b/src/main/java/cz/jzitnik/game/generation/Generation.java index b3d7ad2..9d26c6c 100644 --- a/src/main/java/cz/jzitnik/game/generation/Generation.java +++ b/src/main/java/cz/jzitnik/game/generation/Generation.java @@ -30,6 +30,8 @@ public class Generation { game.getPlayer().setPlayerBlock1(steveBlock); game.getPlayer().setPlayerBlock2(steveBlock2); + game.getInventory().addItem(ItemBlockSupplier.getItem("sand")); + PopulateWorld.populateWorld(world, terrainHeight); Trees.plantTrees(world, terrainHeight); diff --git a/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java b/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java index 4e846af..c88f912 100644 --- a/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java +++ b/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java @@ -1,7 +1,9 @@ package cz.jzitnik.game.handlers.events.handlers.mobs; import cz.jzitnik.game.Game; +import cz.jzitnik.game.annotations.CustomMobFallingAfterMineLogic; import cz.jzitnik.game.annotations.MineEventHandler; +import cz.jzitnik.game.entities.Block; import cz.jzitnik.tui.ScreenRenderer; public class MobMineHandler { @@ -9,8 +11,24 @@ public class MobMineHandler { public void handle(ScreenRenderer screenRenderer, Game game, int x, int y) { var world = game.getWorld(); - var mobs = world[y-1][x].stream().filter(block -> block.isMob() && !block.getBlockId().equals("steve")).toList(); - world[y-1][x].removeAll(mobs); - world[y][x].addAll(mobs); + var mobs = world[y - 1][x].stream().filter(block -> block.isMob() && !block.getBlockId().equals("steve")).toList(); + + for (Block mob : mobs) { + if (mob.getClass().isAnnotationPresent(CustomMobFallingAfterMineLogic.class)) { + var annotation = mob.getClass().getAnnotation(CustomMobFallingAfterMineLogic.class); + var handlerClass = annotation.value(); + try { + var instance = handlerClass.getDeclaredConstructor().newInstance(); + + instance.handle(game, x, y); + continue; + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + world[y - 1][x].remove(mob); + world[y][x].add(mob); + } } } diff --git a/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieFallingAfterMineLogic.java b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieFallingAfterMineLogic.java new file mode 100644 index 0000000..9fb0174 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieFallingAfterMineLogic.java @@ -0,0 +1,31 @@ +package cz.jzitnik.game.mobs.services.zombie; + +import cz.jzitnik.game.Game; +import cz.jzitnik.game.core.CustomMobFallingAfterMineLogicHandler; +import cz.jzitnik.game.entities.items.registry.mobs.Zombie; +import lombok.extern.slf4j.Slf4j; + +// I know this code is shit, but I don't want to deal with it +@Slf4j +public class ZombieFallingAfterMineLogic implements CustomMobFallingAfterMineLogicHandler { + @Override + public void handle(Game game, int x, int y) { + log.debug("Zombie is falling"); + + var world = game.getWorld(); + + var mobsTop = world[y - 2][x].stream().filter(block -> + block.getClass().equals(Zombie.class) && block.getSpriteState().isPresent() && + (block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.TOP) || + block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.TOP_HURT))).toList(); + var mobsBottom = world[y - 1][x].stream().filter(block -> + block.getClass().equals(Zombie.class) && block.getSpriteState().isPresent() && + (block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.BOTTOM_HURT) || + block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.BOTTOM))).toList(); + world[y - 2][x].removeAll(mobsTop); + world[y -1][x].addAll(mobsTop); + + world[y - 1][x].removeAll(mobsBottom); + world[y][x].addAll(mobsBottom); + } +} diff --git a/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java index df223d0..8b13715 100644 --- a/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java +++ b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java @@ -12,12 +12,14 @@ import cz.jzitnik.game.mobs.*; import cz.jzitnik.game.sprites.Zombie; import cz.jzitnik.game.sprites.Zombie.ZombieState; import cz.jzitnik.tui.ScreenMovingCalculationProvider; +import lombok.extern.slf4j.Slf4j; import org.jline.terminal.Terminal; import java.util.*; import static cz.jzitnik.game.sprites.Zombie.ZombieState.*; +@Slf4j @EntitySpawn @EntityLogic("zombie") @EntityHurtAnimationHandler("zombie") @@ -29,6 +31,7 @@ public class ZombieLogic @Override public void nextIteration(EntityLogicProvider.EntityLogicMobDTO entityLogicMobDTO) { + log.debug("Running zombie logic"); } @Override